java >>> 和 >>>=的區別

java >> 和 >>> 以及 >>>= 的區別

  可能你們都知道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

相關文章
相關標籤/搜索