我必须编写一个转换二进制数的Perl脚本,指定为 参数,到十进制数。在问题中,提示使用反向功能。
我们必须假设二进制数采用这种格式
编辑:这就是我所取得的进展(注意这是我教科书中的代码,我已经搞砸了):
#!/usr/bin/perl
# dec2.pl: Converts decimal number to binary
#
die("No arguments\n") if ( $#ARGV == -1 ) ;
foreach $number (@ARGV) {
$original_number = $number ;
until ($number == 0 ) {
$bit = $number % 2 ;
unshift (@bit_arr, $bit) ;
$number = int($number / 2 );
}
$binary_number = join ("", @bit_arr) ;
print reverse ("The decimal number of $binary_number is $original_number\n");
$#bit_arr = -1;
}
执行时:
>./binary.pl 8
The decimal number of 1000 is 8
我不知道怎么说出来让程序知道如何将所有输入的数字加起来。
答案 0 :(得分:1)
您可以使用 sprintf 为您进行转换......
sprintf("%d", 0b010101); # Binary string 010101 -> Decimal 21
sprintf("%b", 21) # Decimal 21 -> Binary 010101 string
当然,您也可以评估前面带有 0b 的二进制字符串来表示二进制文件:
my $binary_string = '010101';
my $decimal = eval("0b$binary"); # 21
答案 1 :(得分:0)
首先,您可能希望从二进制转换为十进制,而不是相反,这意味着您可以使用$binary = '1011001';
之类的输入。
您需要做的第一件事是从中获取单个位( 0 , 1 等)。我们正在谈论将字符串拆分为各自的数字。
for my $bit (split(//, $binary)) {
...
}
这应该是一个很好的起点。有了这个,您就可以应用以下重构所发布的公式所需的一切:
n =(((...)* 2 + a 2 )* 2 + a 1 )* 2 + a 0
[我不知道为什么会推荐reverse
。它可以使用它,但它不是最理想的。]
答案 2 :(得分:0)
你没有 使用reverse
,但它可以很容易地考虑指数和数组索引的问题。
use strict;
use warnings;
my $str = '111110100';
my @bits = reverse(split(//, $str));
my $sum = 0;
for my $i (0 .. $#bits) {
next unless $bits[$i];
$sum += 2 ** $i;
}