2014年6月5日木曜日

Rubyで負の数の16進表現

Rubyで数値を16進文字列に変換するには

irb> 255.to_s(16)
=> "ff"
とto_sを使えばいい。が、負の値に対して同じことをやると
irb> -255.to_s(16)
=> "-ff"
こんな残念な結果を見ることになる。いつも思うんだけど、これって誰が望んでるんだ?

で、負の数のビットパターンを直接見たい場合は

irb> (-255 & 0xffff).to_s(16)
=> "ff01"
irb> (-255 & 0xffffffffffffffff).to_s(16)
=> "ffffffffffffff01"
こうすればいいと気が付いた。16進リテラルは必ず非負扱いのようなので、符号ビットは常にゼロ。当然、どんなに符号拡張されても符号ビットは常にゼロ。それと論理積を取ればどんな値でも符号ビットが落ちるので、それからto_sすれば望んだ結果になる。

0 件のコメント:

コメントを投稿