java中左移、右移、無符號右移的區別


左移(<<)

將一個數對應的二進制表示整體左移,不考慮符號位,左邊超出的部分舍棄,右邊補零。

正數

以數字10為例,二進制表示為

00000000 00000000 00000000 00001010

第一位為符號位,0表示正數,1表示負數。左移1位之后為

00000000 00000000 00000000 00010100

十進制表示為20,相當於乘以2。HashMap擴容時將新容量增加為原來容量的兩倍,就是使用左移實現的。

負數

以負數-10為例,二進制表示為

1111 1111 1111 1111 1111 1111 1111 0110

左移1位結果為

1111 1111 1111 1111 1111 1111 11110 1100

十進制為-20,也是相當於乘以2。

右移(>>)

將一個數對應的二進制表示整體右移,考慮符號位,左邊的用原有符號位補充,右邊超出的部分舍棄。

正數

以10為例

00000000 00000000 00000000 00001010

右移1位

00000000 00000000 00000000 00000101

十進制表示為5,相當於除以2。ArrayList擴容時將新容量增加為原來的1.5倍,就是使用右移實現的。

負數

以負數-10為例

1111 1111 1111 1111 1111 1111 1111 0110

右移1位

1111 1111 1111 1111 1111 1111 1111 1011

十進制表示為-5,也是相當於除以2。

無符號右移(>>>)

將一個數的二進制表示整體右移,不考慮符號位,左邊部分總是以0填充,右邊部分舍棄。

正數

和上面的右移一致。

負數

以-10為例

1111 1111 1111 1111 1111 1111 1111 0110

無符號右移1位

01111 1111 1111 1111 1111 1111 1111 1011

十進制表示為2147483643。HashMap中在求一個數最接近的2的N次冪時使用到了無符號右移。

擴展

如果一個int型數字左移超過32位,如33位,相當於左移1位,右移、無符號右移同理。

a << n == a << (n % 32)

參考

java中右移運算符>>和無符號右移運算符>>>的區別


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM