用于将二进制数转换为十进制数的Perl脚本

时间:2016-04-20 20:21:46

标签: perl binary decimal

我必须编写一个转换二进制数的Perl脚本,指定为 参数,到十进制数。在问题中,提示使用反向功能。

我们必须假设二进制数采用这种格式

Binary

编辑:这就是我所取得的进展(注意这是我教科书中的代码,我已经搞砸了):

#!/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

我不知道怎么说出来让程序知道如何将所有输入的数字加起来。

3 个答案:

答案 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;
}