• ベストアンサー

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モジュールは使えないものとします。

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

use bigint; してれば 10進→二進変換 $i=4294967295+1; print Math::BigInt::as_bin($i); #結果:0b100000000000000000000000000000000 二進→10進変換 $b=0b100000000000000000000000000000001; print $b; #結果:4294967297 のようにそのままできます

noname#19884
質問者

お礼

できました~、ありがとうございます。

その他の回答 (2)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

二進→10進変換 $x = Math::BigInt->new('0b100000000000000000000000000000001'); でもいいですけど

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.1

perlを使用されている環境が不明ですのでなんともいえませんが、 1.貴方の環境が64ビット整数をサポートするマシン(Cコンパイラ)で、かつperlが64ビット整数をサポートしている場合は、packのオプションで q/Q(quad=64ビット整数)が使用可能です。 これが、使用できるならこれを使用すればできると思います。 2.もし使用できないなら、自前で 16進数→10進数→二進数の関数を作らざるを得ないと思います。

関連するQ&A