我想根据给定的用户输入创建二进制数。
输入 - 数字数组
输出 - 二进制数
应创建二进制数,使其在所有作为输入的位置都有一个。
在给定的情况下,输入是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";
执行后,我将z的值设为0。
我需要将此二进制文件转换为十六进制。
是否有一些将二进制转换为十六进制的函数?
答案 0 :(得分:2)
[ ]
创建一个数组并返回对该数组的引用,因此您将一个标量分配给(名称不当)@x
。
你也在滥用join
。始终使用use strict; use warnings qw( all );
!它会发现这个错误。
修正:
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
您似乎想要0b1000101
,因此我们需要更正索引。
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
答案 1 :(得分:1)
一些问题:
@x = [ 1, 3, 7 ];
不是三个整数的数组。它是一个包含单个数组引用的数组。你想要的是圆括号,而不是方括号:@x = ( 1, 3, 7 );
join
返回的字符串未分配给$z
但即便如此,你的代码还是错误的:
它在$z
的 end 附加了一点,而不是开头
有一个没有业务的尾随零。