Perl:创建一个二进制数并将其转换为十六进制数

Perl:创建一个二进制数并将其转换为十六进制数,perl,binary,hex,Perl,Binary,Hex,我想从给定的用户输入创建一个二进制数 输入-数字数组 输出-二进制数 应创建一个二进制数,以便在作为输入的所有位置上都有一个二进制数 在给定的情况下,输入是1、3和7,因此我的二进制no应该是1000101,因此它在左侧的1、3和7处有1 @x = [ 1, 3, 7 ]; $z = 0; for( $i = 0; $i < 10; $i++ ){ foreach $elem ( @x ){ if( $elem == $i ){ join(

我想从给定的用户输入创建一个二进制数

输入-数字数组

输出-二进制数

应创建一个二进制数,以便在作为输入的所有位置上都有一个二进制数

在给定的情况下,输入是1、3和7,因此我的二进制no应该是
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";
@x=[1,3,7];
$z=0;
对于($i=0;$i<10;$i++){
foreach$elem(@x){
如果($elem==$i){
联接(“,$z,1);
}
否则{
联接(“,$z,0);
}
}
}
打印“z的值:$z”;
执行之后,我得到z的值为0

我需要把这个二进制转换成十六进制


是否有一些函数可以将二进制转换为十六进制?

[]
创建一个数组并返回对该数组的引用,因此您将单个标量指定给(名称不正确的)
@x

您还误用了
join
。始终使用
严格使用;使用警告qw(全部)!它会发现这个错误

固定的:

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

my $num = 0;
$num |= 1 << $_ for @bits;
                                           #   76543210
printf("0b%b\n", $num);                    # 0b10001010
printf("0x%X\n", $num);                    # 0x8A
有几个问题:

  • @x=[1,3,7]不是三个整数的数组。它是一个包含单个数组引用的数组。你想要的是圆括号,而不是方括号:
    @x=(1,3,7)

  • join
    返回的字符串未分配给
    $z


但即便如此,您的代码还是有缺陷:

  • 它在
    $z
    的末尾追加一位,而不是开头

  • 有一个尾随的零,在那里没有任何意义


看起来您正在尝试学习Perl。请始终
使用严格的
使用警告
。这些pragmas将帮助您更快地发现错误,因为Perl将抱怨更多的事情。非常感谢。您能告诉我如何将十六进制值存储在变量中吗$hex_value=%X($num)将起作用??我正在尝试学习Perl。你能解释一下这条线是怎么工作的吗$num |=1使用
sprintf
而不是
printf
来获取字符串,而不是打印它。
1
my @bits_plus_1 = ( 1, 3, 7 );

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