はちゅにっき

こっちのブログはまったり更新

64bit unsigned int を pack したい

ただし 32bit 環境で。


64bit の整数を 32bit 環境の Perl で扱うためには、いくつか方法はありますが Pure Perl で動作し、コアモジュールとしても登録されている Math::BigInt を今回は使うことにしました。
本当は以下の用にそのまま pack できればいいんだけれど、そうは問屋が卸さず。

my $bigint = Math::BigInt->from_hex('0x0123456789ABCDEF');
pack 'NN', $bigint;  # -> NG

ということで、なんとか pack してみようじゃないかと。
単純な方針としては、上位 32 bit と下位 32 bit を別々に pack してあげればいいと思うんだけど*1、どうやって分離するのが早いんだろう?
ということで、ベンチマークしてみることに。

上記の結果は 64bit 環境で実行しているため、直接 pack しているのは参考タイムです。
32bit 環境でも「ビットシフトと論理積」で計算した場合と、「除算と剰余算」で計算した場合では同じ傾向になりました。
分かっていたことだけれど pack が早すぎなので、64bit 環境では素直に pack するのがいいんですね、きっと。
でも「ビットシフトと論理積」より「除算と剰余算」の方が早かったのは意外でした。
なんかおかしなことしてるのかなー?
あ、当然 Math::BigInt の実装に依存している部分は大いにあると思うけれど。
ソースコード読んでみるのがいいのかな。

*1:もっといい方法があれば知りたい!