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)