一次性搞清楚Java中右移運算符和左移運算符

今天在ArrayList源碼的時候看到擴容機制中的右移操作
在這裏插入圖片描述
一時沒反應過來到底是擴容了多少,痛定思痛的決定好好研究下java中的左移右移操作。
提示:由於下文涉及到原碼,補碼,反碼等相關知識,有疑問的同學可以移步https://www.cnblogs.com/goahead–linux/p/10904701.html瞭解一下,個人覺得這篇博客解釋的很透徹

左移 <<

      由於不需要考慮符號位的變化,對左移來說左移時只需要在右邊加0就可以,邏輯左移和算術左移都是一樣的,在Java中左移操作符只有<<,所以相對比較簡單。
      比如2<<3用二進制表示就是10→10000也就是16,對於二進制的數值來說左移n位等於原來的數值乘以2的n次方,2<<3就是2*23=16,這樣計算起來會方便一點。

右移

      由於右移時需要考慮符號位的變化,所以Java中的右移有算術右移>>和邏輯右移>>>

算術右移 >>

      算術右移就是考慮符號位的右移,右移之後的空位用符號位來補充,我們知道在二進制中符號位用0來表示正數,1來表示負數,所以如果是負數右移就往左邊補1,正數右移就往左邊補0。
      拿-4來舉例,-4>>1,
-4的原碼
10000000 00000000 00000000 00000100
-4的補碼
11111111111111111111111111111100
右移1位,左邊補1
11111111111111111111111111111110 [0]
重新取補碼
10000000 00000000 00000000 00000010
結果爲-2
如果是4呢,4>>1,
4的原碼,補碼
00000000000000000000000000000100
右移1位,左邊補0
00000000000000000000000000000010 [0]
結果爲2

邏輯右移 >>>

      邏輯右移就是不考慮符號位的右移,也就是不管正數還是負數,右移時都往左邊補0。
      用-1來舉例,-1>>>1
-1的原碼
10000000 00000000 00000000 00000001
-1的補碼
11111111111111111111111111111111
右移1位,左邊補0
01111111111111111111111111111111 [1]
符號位爲0,所以補碼相同,結果爲231-1

      如果是1>>>1呢
1的原碼,補碼
00000000000000000000000000000001
右移1位
00000000000000000000000000000000 [1]
結果爲0
6>>>2
6的原碼,補碼
00000000 00000000 00000000 00000110
右移2位
00000000 00000000 00000000 00000001 [10]
結果爲1

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章