2017-04-12 8 views
1

私はサイズ4096のバイト配列を持っています。フィールド0を0xA2で、フィールド1を0xF0で埋めます。Java:バイト[]ビットシフト操作を短く

私の目標は、フィールド0を8ビット左にシフトし、次にフィールド1とのOR演算を行い、それを短い変数に格納することです。

紙の上での結果は次のようになります。

 1010 0010 (0xA2) 
>>shift left by 8 bits 
1010 0010 0000 (0xA20) 

>>OR-operation with field 1 
1010 0010 0000 (0xA20)(field 0) 
    1111 0000 (0xF0)(field 1) 
---------------------- 
1010 1111 0010 (0xAF2) 

あり、すでにa similar postだったが、それは少しだけ助けました。 私はキャストしていますが、シフトされたビットをカットするようです。 コードは次のとおりです。

public static void main(String[] args) { 
     byte[] myMem = new byte[4096]; 
     myMem[0] = (byte)0xA2; 
     myMem[1] = (byte)0xF0; 

     short test = (short)(myMem[0] << 8 | myMem[1]); 
    } 

デバッガは、以下の値を示しています。

myMem[0] = -94 (which is correctly 0xA2) 
myMem[1] = -16 (which is correctly 0xF0) 
test = -16 (which is wrong, 0x00A2. Should be -23824 or 0xA2F0). 

どこかに私は私が思う論理ミスを犯したが、私はしかし、それを見つけることができません。

答えて

3

使用

short test = (short)((myMem[0] << 8) | ((myMem[1])& 0xff)); 
+1

興味深いです。私は、Javaのバイトデータ型について詳しく知っておくべきだと思います。ここであなたの答えがなぜ働いたのか自分に尋ねた後に私が見つけた記事です:http://stackoverflow.com/questions/19061544/bitwise-anding-with-0xff-is-important – RnBandCrunk