2

64個のバイナリシンボルを含む文字列があります。

10進数に変換する必要があります。どうすればPerlでそれを行うことができますか?

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

動作しません。最初の32ビットだけを変換します。

4

2 に答える 2

8

ドキュメントから、

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上記を以下に減らすことができるので、それをコーディングした人はおそらく、2進数を解析する能力に気づいていませんでした

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
于 2012-05-11T17:26:50.480 に答える
4
use Math::BigInt;
my $b = Math::BigInt->new('0b1010000110100001101000011010000110100001101000011010000110100001');
print $b;

単なるアイデアであり、サブルーチンと同等のコードではありません。
ここでの2進数は任意の2進数です。あなたのものを使用してください。

于 2012-05-11T17:31:01.723 に答える