2016-12-01 4 views
1

私はJavaで奇妙な問題を抱えており、WindowsとMacの両方のシステムでテストし、この問題が一貫して発生しています。Javaビットワイズ演算子(ゼロ塗りつぶしシフト)ゼロで埋めていない

このコード

int a = -32; //11100000 as per two's complement 
System.out.println(a >>> 2); 

を見て、私はそのバイナリ形式で00111000である、このコードは56を生成するために期待しています。ただし、バイナリ形式で1073741816、111111111111111111111111111000という値が生成されます。 intは32ビットのJavaであると理解していますが、バイトのタイプの設定も同じことをします。私はこの

int b = 0b11100000; 
System.out.println(b); 
System.out.println(b >>> 2); 

ようなバイナリリテラルを宣言した場合

しかし最初の文は、値224(期待を-32)を生成する第二の文は56

の期待値を生成している間、私はつもりです狂った?

+0

「Integer.toBinaryString()」などを使用してデバッグする方が簡単かもしれません –

答えて

1

bでのあなたのビットパターンは、あなたが32ビットであるint使用しているあなたが言うように11100000ではありませんが、11111111 11111111 11111111 11100000

- ないバイト - とそれを変更しないバイナリリテラルを使用します。

intではなくbyteを使用しても、Javaビットシフト演算子は最初に32ビット未満の型を32ビットに昇格させるため、問題は解決しません。

シフト後のビットパターンは00111111 11111111 11111111 11111000です。

あなたは8ビットの値で作業を模倣したい場合は、に必要なビットシフトを適用する前に、下位8ビットに32ビットの値をビットマスク(あなたにも今>>ではなく>>>を使用することができます)

System.out.println((b & 0xff) >>> 2); 
関連する問題