Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 大数十进制和二进制转换_Perl_Binary_Decimal - Fatal编程技术网

Perl 大数十进制和二进制转换

Perl 大数十进制和二进制转换,perl,binary,decimal,Perl,Binary,Decimal,我必须将Perl中的大数字从十进制转换为二进制,反之亦然 该长度的示例编号: Dec: 76982379919017706648824420266 Bin: 111110001011111001010101000010011001000010101111001110000000000000000000000000000000000000000000 我发现了两个功能: sub dec2bin { my $str = unpack("B32", pack("

我必须将Perl中的大数字从十进制转换为二进制,反之亦然

该长度的示例编号:

Dec: 76982379919017706648824420266
Bin: 111110001011111001010101000010011001000010101111001110000000000000000000000000000000000000000000
我发现了两个功能:

sub dec2bin {
    my $str = unpack("B32", pack("N", shift));
    $str =~ s/^0+(?=\d)//;   # otherwise you'll get leading zeros
    return $str;
}
sub bin2dec {
    return unpack("N", pack("B32", substr("0" x 32 . shift, -32)));
}
但是,他们似乎都停止了与大数字打交道

Output of
bin2dec(111110001011111001010101000010011001000010101111001110000000000000000000000000000000000000000000)
is 1543163 
and output of
dec2bin(76982379919017706422040262422)
is 11111111111111111111111111111111
有没有一种合适的方法来处理这么大的数字呢?

Perl提供了。用
使用bignum打开它们。您的转换函数如下所示:

use bignum;
my ($b_orig, $d_orig, $b, $d);

$d_orig = 76982379919017706648824420266;
$b_orig = '111110001011111001010101000010011001000010101111001110000000000000000000000000000000000000000000';

print ("dec($b_orig) [orig] = $d_orig;\n");
print ("dec($b_orig) [comp] = " . Math::BigInt->from_bin($b_orig) . ";\n");
print ("bin($d_orig) [orig] = $b_orig;\n");
print ("bin($d_orig) [comp] = ".substr(Math::BigInt->new($d_orig)->as_bin(), 2).";\n");
警告

您提供的二进制数和十进制数之间没有对应关系。我还没有检查这是否是bigint库的缺陷。

您可以使用。请注意,这些函数的输入应该是字符串

use Math::BigInt;

sub bin2dec {
  my $bin = shift;
  return Math::BigInt->new("0b$bin");
}

sub dec2bin {
  my $dec = shift;
  my $i = Math::BigInt->new($dec);
  return substr($i->as_bin(), 2);
}

print "Dec: " . bin2dec("111110001011111001010101000010011001000010101111001110000000000000000000000000000000000000000000") . "\n";
print "Bin: " . dec2bin("76982379919017706648824420266") . "\n";
输出为:

Dec: 76982379919017710405206147072
Bin: 111110001011111001010101000010011001000010101111001101001001010101100110001100111001011110101010

Perl的bigint提供了对大整数的透明支持:

perl -Mbigint -E 'say oct "0b111110001011111001010101000010011001000010101111001110000000000000000000000000000000000000000000"' 76982379919017710405206147072 perl-Mbigint-E'say oct“0b111110001011111001010101000010110010000101111001110000000000000000000000000000000000000” 76982379919017710405206147072 您不需要编写自己的转换例程
oct
将为您转换