俺#

新潟市でIT業を営むおっさんのブログ。

Javaでビット演算

id:sasayuki氏にコメント頂きました。さんきゅーです。

int a;
byte b1;
byte b2;

b1 = (byte)0xab;
b2 = 0x12;

a = (b1 & 0xff) << 8 | (b2 & 0xff);

おお。うまくいきました!コメントを見た瞬間1秒間ほど理屈がわからなかったんですが(最初の0.5秒間は「byteの変数に0xffでマスクしても変化しねーよ!ボケ」とか思ったのでした。スミマセン。後の0.5秒で反省しました(^^;)、内部的に

0xab→0xffffffab(intに拡張)→0x000000ab(0x000000ffでマスク)→0x0000ab00(左シフト)

という動きになる訳ですな。結果、aは0xab12になります。確かに。大抵のCPUには演算子「<<<」に相当するオペコードがあると思うので無駄も甚だしいと思いつつ、そもそもそーゆー次元の話になるとJavaを使うこと自体が無駄なので諦めます。マスクして符号を無視するという発想が出ないこと自体、脳味噌の柔軟性が落ちた気がしますわ(苦笑

またJavaに詳しくなってしまった(?)。今後はこの様に記述します(^^;;