左移(<<)
將一個數對應的二進制表示整體左移,不考慮符號位,左邊超出的部分舍棄,右邊補零。
正數
以數字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)