俺#

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

Javaでビット演算

2つのbyte型の変数があってですね、それぞれをint型の変数の下位2バイトに格納してやりたいと思う訳ですよ。(charが8bitでintが32bitな)C言語で解りやすく書くならこんな感じですな。

unsigned int a;
unsigned char b1 = 0xab, b2 = 0x12;

a = b1;
a <<= 8;
a |= b2;

結果は期待通り「a=0xab12」になるのですよ。ところが、Javaだと符号なし整数がない。シフト演算子も符号なし演算をするのは「>>>」しかない。つまり、

a = b1;

とした時点で丁寧に符号拡張され「a = 0xffffffab」になってしまう。

a = b1 << 8;

としても「a = 0xffffab00」になってしまう。逃げ道としてcharを符号なし整数として使おうにも演算時には内部的にintに拡張されて結果は同様。苦肉の策として、

int t1, t2;

t1 = b1 << 24;
t1 >>>= 16;
t2 = b2 << 24;
t2 >>>= 24;
a = t1 | t2;

こうしてみたところ期待通りに動作しました。Javaってビット演算もマトモにできないクソ言語なんでしょうか?つ〜か、本当にこんな方法しかないのか?そんな馬鹿な。誰かJava的に正しいやり方教えて下さい(T_T)