64個のバイナリシンボルを含む文字列があります。
10進数に変換する必要があります。どうすればPerlでそれを行うことができますか?
sub bin2dec {
return unpack("N", pack("B64", substr("0" x 64 . shift, -64)));
}
動作しません。最初の32ビットだけを変換します。
ドキュメントから、
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
use Math::BigInt;
my $b = Math::BigInt->new('0b1010000110100001101000011010000110100001101000011010000110100001');
print $b;
単なるアイデアであり、サブルーチンと同等のコードではありません。
ここでの2進数は任意の2進数です。あなたのものを使用してください。