- ベストアンサー
bigintのpack
Perlで16進数→10進数→二進数の変換を行うために packとunpackを使用するのですが 32ビット以上の数であるためにbigintを使用しています。 そのときに 10進→二進変換 二進→10進変換などはどのように行えば良いのでしょうか? 32bitまでならば sub bin_dec { return (unpack("N",(pack("B32", $_[0])))); } sub dec_bin { return (unpack("B32", pack("N", $_[0]))); } のように行えるのですが Nは32bitのlong型のままですので 4294967295以上の数は4294967295になってしまいます。 どうすれば良いのでしょうか? Bit/Vectorモジュールは使えないものとします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
use bigint; してれば 10進→二進変換 $i=4294967295+1; print Math::BigInt::as_bin($i); #結果:0b100000000000000000000000000000000 二進→10進変換 $b=0b100000000000000000000000000000001; print $b; #結果:4294967297 のようにそのままできます
その他の回答 (2)
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
二進→10進変換 $x = Math::BigInt->new('0b100000000000000000000000000000001'); でもいいですけど
- tatsu99
- ベストアンサー率52% (391/751)
perlを使用されている環境が不明ですのでなんともいえませんが、 1.貴方の環境が64ビット整数をサポートするマシン(Cコンパイラ)で、かつperlが64ビット整数をサポートしている場合は、packのオプションで q/Q(quad=64ビット整数)が使用可能です。 これが、使用できるならこれを使用すればできると思います。 2.もし使用できないなら、自前で 16進数→10進数→二進数の関数を作らざるを得ないと思います。
お礼
できました~、ありがとうございます。