2017-02-19 62 views
1

我嘗試在JAVA中使用正確的二進制移位。請看下面的代碼:JAVA右移位返回wrond值

int val = 180000; 
val >>>= 8; // val == 703, ok 
val >>>= 8; // val == 2 , lok 
val >>>= 8; // val == 0 , ok 
... 

它的工作是確定的。但是,當我嘗試使用此代碼(從C項目ctr + c ctr + v)我無法計算正確的值,當移位len是最大的32位。

int val; 
val = 180000; 
val >>>= 8; //val = 703, ok 
val = 180000; 
val >>>= 16; //val = 2, ok 
val = 180000; 
val >>>= 32; //val = 180000, wrong :(

爲什麼上次操作在第二個例子中計算錯誤的值?

回答

2

爲什麼上次在第二個例子中的操作計算出錯誤的值?

該值根據規範計算。你的期望是錯誤的。從JLS 15.19開始:

如果左側操作數的提升類型是int,那麼只有右側操作數的五個最低位用作移位距離。就好像右側的操作數受掩碼值0x1f(0b11111)的按位邏輯AND運算符&(第15.22.1節)的處理。實際使用的換檔距離總是在0到31的範圍內。