2017-09-11 12 views
1

주어진 사용자 입력에서 이진수를 만들고 싶습니다.Perl : 이진수를 만들고이를 16 진수로 변환합니다.

입력 - 다수의 배열

출력 - 이진수가 입력으로 주어졌다 모든 장소에서 하나를 갖도록 생성한다

이진수.

주어진 경우 입력은 1, 3 및 7이므로 내 이진수는 1000101이어야하며 왼쪽부터 1, 3 및 7 자리에 1이 있습니다.

@x = [ 1, 3, 7 ]; 
$z = 0; 
for($i = 0; $i < 10; $i++){ 
    foreach $elem (@x){ 
     if($elem == $i){ 
      join("", $z, 1); 
     } 
     else{ 
      join("", $z, 0); 
     } 
    } 
} 
print "Value of z: $z"; 

은 실행 후, 나는 16 진수 바이너리를 변환 할 필요가 0

로 Z의 값을 얻고있다.

바이너리를 16 진수로 변환하는 기능이 있습니까?

+2

당신이 펄을 배우려고하는 것처럼 보입니다. 항상 '엄격한 사용'과 '경고 사용'을 사용하십시오. 그 pragma는 Perl이 더 많은 것들에 대해 불평 할 때 더 빨리 실수를 찾는 것을 도와줍니다. – simbabque

답변

2

[ ]은 배열을 만들고 해당 배열에 대한 참조를 반환하므로 하나의 스칼라에 (약칭으로) @x을 할당합니다.

join도 오용됩니다. 항상 use strict; use warnings qw(all);을 사용하십시오! 이 오류를 발견했을 것입니다.

my @bits = (1, 3, 7); 

my $num = 0; 
$num |= 1 << $_ for @bits; 
              #
printf("0b%b\n", $num);     # 0b10001010 
printf("0x%X\n", $num);     # 0x8A 

당신이 0b1000101를 원하는 것 같다, 그래서 우리는 인덱스를 수정해야합니다

가 수정되었습니다.

my @bits_plus_1 = (1, 3, 7); 

my $num = 0; 
$num |= 1 << ($_ - 1) for @bits_plus_1; 
              #
printf("0b%b\n", $num);     # 0b1000101 
printf("0x%X\n", $num);     # 0x45 
+0

고마워요. 어떻게 16 진수 값을 변수에 저장할 수 있습니까? $ hex_value = % X ($ num)가 작동합니까 ?? –

+0

나는 Perl을 배우려고 노력하고있다. 이 회선이 어떻게 작동하는지 설명해 주시겠습니까? @ bits_plus_1에 대해 $ num | = 1 << ($ _ - 1); –

+0

문자열을 인쇄하는 대신에'printf' 대신'sprintf'를 사용하십시오. – ikegami

1

몇 가지 문제 :

  • @x = [ 1, 3, 7 ]; 세 정수의 배열이 아닙니다. 단일 배열 참조를 포함하는 배열입니다. @x = (1, 3, 7);

  • join에 의해 반환되는 문자열 $z


에 할당되지 않은 그러나 그렇다하더라도 코드가 버그 :

    당신이 원하는 것은 괄호가 아니라 대괄호이다
  • 끝에의 비트가 추가됩니다. beginnin이 아닌 $z입니다. g

  • 비즈니스가없는 후행 0이 있습니다.