可能你們都知道java中>> 和 >>> 的區別,那這裏我也囉嗦一下,>> 和 >>> 都是右移操做,只不過>>>是無符號右移,也就是右移以後高位補零。對於正數來講,二者沒有什麼區別,可是對於負數來講,>> 右移以後仍是負數,而>>>右移以後就變成了正數,你們能夠參看一下例子:java
1 public class ShiftTest { 2 public static void main(String[] args) { 3 int n = 15; 4 System.out.println(java.lang.Integer.toBinaryString(n)); 5 System.out.println(n >> 2); 6 System.out.println(n >>> 2); 7 8 int m = -15; 9 System.out.println(java.lang.Integer.toBinaryString(m)); 10 System.out.println(m >> 2); 11 System.out.println(m >>> 2); 12 } 13 } 輸出結果 1111 3 3 11111111111111111111111111110001 -4 1073741820
此例以及結果你們必定也能看明白,惟一要注意的是計算機是以補碼的形式存儲的,你們能夠去查看相關資料。那接下來就說一下 >>> 和 >>>= 的區別(由於有一次同窗翻看ThreadLocal源碼的時候,發現了cleanSomeSlots方法裏有>>>=這個操做符,之前沒有見過這個操做,只知道>>>是無符號右移,因而咱們就討論起來),我當時寫了一段測試代碼,以下所示:測試
1 public class ShiftTest { 2 public static void main(String[] args) { 3 int n = -4; 4 System.out.println(n >>>= 1); 5 System.out.println(n >>> 1); 6 7 int j = 4; 8 System.out.println(j >>>= 1); 9 System.out.println(j >>> 1); 10 } 11 } 12 輸出結果 2147483646 1073741823 2 1
今後例中,你們可能比較疑惑了,第9行爲何會輸出1,應該是2啊,我也比較納悶,這個時候同窗一點撥,就恍然大悟,其實j在第8行被從新賦值了成了2,而第9行再進行右移固然輸出1。從這個例子中咱們就知道了其實>>>=就是相似於+=這種操做,右移以後作了一個賦值。spa
其實移位操做在咱們平時用的並很少,可是在閱讀JDK源碼的時候常常會出現,好比concurrent包裏的ThreadPoolExcutor、ConcurrentHashMap等。因此掌握移位操做以及原碼、反碼、補碼、仍是頗有必要的。code