2012-05-11 32 views
2

64文字のバイナリ記号が含まれています。perl。 64ビットの2進数を10進数に変換する

10進数に変換する必要があります。 perlでどうすればいいですか?

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

は機能しません。それはちょうど最初の32ビットを変換します。 docsから

+0

おそらく最初に考慮すべきことは、perlが64ビットサポートで構築されている場合ですが、これに100%依存するかどうかは完全にはわかりません。 – ArtM

答えて

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("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 
4
use Math::BigInt; 
my $b = Math::BigInt->new('0b1010000110100001101000011010000110100001101000011010000110100001'); 
print $b; 

ジャストアイデアではなく、あなたのサブルーチンと同等のコード。
ここでの2進数は任意です。あなたのものを使用してください。

+0

+1(私はこれが好きです!)..または単純に 'print Math :: BigInt-> new( '0b'。$ binaryStr);' –

関連する問題