2016-12-01 118 views
1

我一直在使用Java獲得一個奇怪的問題,並且已經在Windows和Mac系統上進行了測試,並且一直出現這個問題。Java位運算符(零填充移位)不填充零

看看這段代碼

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

我希望這個代碼產生56,這是它的二進制形式00111000。但是,它會以二進制形式生成值1073741816,111111111111111111111111111000。我知道整數是32位的Java,但設置字節的類型也是一樣的。

但是如果我聲明一個二進制文字這樣

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

第一語句產生的值224(預期-32),而第二個語句產生的56

預期值我要去瘋?

+0

使用'Integer.toBinaryString()'或類似的方法調試可能會更容易 –

回答

1

b你的位模式是不是11100000像你說的,但11111111 11111111 11111111 11100000

您使用的int這是32位 - 而不是一個字節 - 並使用二進制文字不會改變這一點。

即使您使用的是byte而非int它也不能解決您的問題,因爲Java位移運算符首先將小於32位的任何類型提升爲32位。

所以最終的位模式是00111111 11111111 11111111 11111000轉變後。

如果你想模仿與8位值的工作,你需要運用位位移前位掩碼的32位值的低8位(您不妨使用>>而非>>>現在)

System.out.println((b & 0xff) >>> 2);