Java中有趣的移位操作!徹底弄懂各個移位操作符的使用方式
2021-07-12 254

<<
>>
- >>: 右移運算,為算術右移
- 如果數字為正數時,移位後在前面補0
- 如果數字為負數時,移位後在前面補1
>>>
移位運算結果
- 在不大於自身數值型別最大位數的移位時,一個數左移n位,就是將這個數乘以2的n次冪
- 一個數右移n位,就是將這個數除以2的n次冪,然後取整
- 如果移動位數超出自身數值型別的最大位數, 只要將移位數和自身數值型別的最大位數取餘得到的數字套用方法即可
注意
- 三種移位運算作用的左運算元有五種:
- long
- int
- short
- byte
- char
- 在作用不同的運算元型別時的具體操作過程不同,遵循以下原則:
- int移位時, 左運算元是32位,此時移位符號作用在32位bit上
- 比如: 1 >> 3,是將00000000 00000000 00000000 00000001這32位向右移動3位
- long移位時,左運算元是64位,此時移位符號作用在64位bit上
- short,byte,char在移位之前首先將資料轉換為int, 然後再移位,此時移位符號作用在32位bit上
- 比如: (byte)0xff >>> 7,是將11111111 11111111 11111111 11111111這32位向右移動7位,得到的結果是00000001 11111111 11111111 11111111
- 由上可知:
- 當左運算元為long時,移位之後得到的型別是long
- 當左運算元是其它四種類型時,移位之後得到的型別時int
- 所以當左運算元是short,byte,char時,使用 >>=, >>>=, <<= . 其實是將得到的int做低位擷取得到的數值,得到的值往往會錯
- 三種移位符號除了對左運算元有操作規則外,對右運算元也有操作規則:
- 如果左運算元是int或者轉換之後是int, 那麼右運算元只有低5位有效,因為int總共就32位
- 22 >> 33 與 22 >> 1 的結果是一樣的,都是11
- 如果左運算元是long, 那麼右運算元只有低6位有效