64文字のバイナリ記号が含まれています。perl。 64ビットの2進数を10進数に変換する
10進数に変換する必要があります。 perlでどうすればいいですか?
sub bin2dec {
return unpack("N", pack("B64", substr("0" x 64 . shift, -64)));
}
は機能しません。それはちょうど最初の32ビットを変換します。 docsから
64文字のバイナリ記号が含まれています。perl。 64ビットの2進数を10進数に変換する
10進数に変換する必要があります。 perlでどうすればいいですか?
sub bin2dec {
return unpack("N", pack("B64", substr("0" x 64 . shift, -64)));
}
は機能しません。それはちょうど最初の32ビットを変換します。 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("0b" . shift)
に減少させることができるので、おそらく進数を解析するoct
の能力に気づいていなかった。しかし、あなたが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進数は任意です。あなたのものを使用してください。
+1(私はこれが好きです!)..または単純に 'print Math :: BigInt-> new( '0b'。$ binaryStr);' –
おそらく最初に考慮すべきことは、perlが64ビットサポートで構築されている場合ですが、これに100%依存するかどうかは完全にはわかりません。 – ArtM