【问题标题】:perl. convert 64-bit binary number to decimalperl.将 64 位二进制数转换为十进制数
【发布时间】:2012-05-11 17:11:41
【问题描述】:

我有一个包含 64 个二进制符号的字符串。

我需要把它转换成十进制数。如何在 perl 中做到这一点?

sub bin2dec {
    return unpack("N", pack("B64", substr("0" x 64 . shift, -64)));
}

不起作用。它只转换前 32 位。

【问题讨论】:

  • 可能首先要考虑的是您的 perl 是否支持 64 位,但我不确定它是否 100% 依赖于此。

标签: perl pack unpack


【解决方案1】:

来自docs

N  An unsigned long (32-bit) in "network" (big-endian) order.

64 位等效项是“Q>”。

q  A signed quad (64-bit) value.
Q  An unsigned quad value.
  (Quads are available only if your system supports 64-bit
  integer values _and_ if Perl has been compiled to support
  those. Raises an exception otherwise.)

>   sSiIlLqQ   Force big-endian byte-order on the type.
    jJfFdDpP   (The "big end" touches the construct.)

所以你可以使用以下内容:

unpack("Q>", pack("B64", substr("0" x 64 . shift, -64)))

也就是说,上面的内容是不必要的复杂。编写代码的人可能不知道oct 解析二进制数的能力,因为上面可以简化为

oct("0b" . shift)

但是,如果您没有 64 位版本的 Perl,您会怎么做?您需要使用某种重载数学运算的对象。您可以使用Math::BigInt,但我怀疑它不会像Math::Int64 那样快。

use Math::Int64 qw( string_to_int64 );
string_to_int64(shift, 2)

例如,

$ perl -MMath::Int64=string_to_int64 -E'say string_to_int64(shift, 2);' \
   100000000000000000000000000000000
4294967296

【讨论】:

    【解决方案2】:
    use Math::BigInt;
    my $b = Math::BigInt->new('0b1010000110100001101000011010000110100001101000011010000110100001');
    print $b;
    

    只是想法,而不是您的子例程的等效代码。
    这里的二进制数是任意的。使用你的。

    【讨论】:

    • +1(我喜欢这个!)..或者只是print Math::BigInt->new('0b' . $binaryStr);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-08
    • 1970-01-01
    • 2011-01-08
    • 2010-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多