Java中有趣的移位操做!完全弄懂各個移位操做符的使用方式

<<

  • <<: 左移運算,左移幾位就補幾個0

>>

  • >>: 右移運算,爲算術右移
    • 若是數字爲正數時,移位後在前面補0
    • 若是數字爲負數時,移位後在前面補1

>>>

  • >>>: 無符號右移,爲邏輯右移.忽略符號,空位補0
  • 無符號右移規則: 忽略了符號位擴展,0補最高位,無符號右移運算符 >>> 只對32位和64位值有意義
  • 若是要移位的數是正數時:
    • 右移和無符號右移的值是同樣的
  • 若是要移位的數是負數時:
    • 右移後的值仍是負數
    • 無符號右移後的值則爲正數
  • 區別:
    • 對於正數而言 ,>>>>> 沒有區別
    • 對於負數而言,因爲無符號右移忽略了最高位數的符號位.因此:
      • -2 >>> 1 = 2147483647(Integer.MAX_VALUE)
      • -1 >>> 1 = 2147483647(Integer.MAX_VALUE)
    • 所以要判斷兩個Integer類型的數符號是否相同,能夠這樣判斷:
    return ((a >> 31) ^ (b >> 31)) == 0;
    複製代碼

移位運算結果

  • 在不大於自身數值類型最大位數的移位時,一個數左移n位,就是將這個數乘以2n次冪
  • 一個數右移n位,就是將這個數除以2n次冪,而後取整
    • 若是移動位數超出自身數值類型的最大位數, 只要將移位數自身數值類型的最大位數取餘獲得的數字套用方法便可

注意

  • 三種移位運算做用的左操做數有五種:
    • long
    • int
    • short
    • byte
    • char
    • 在做用不一樣的操做數類型時的具體操做過程不一樣,遵循如下原則:
      • int移位時, 左操做數是32位,此時移位符號做用在32bit
        • 好比: 1 >> 3,是將00000000 00000000 00000000 00000001這32位向右移動3位
      • long移位時,左操做數是64位,此時移位符號做用在64bit
      • short,byte,char在移位以前首先將數據轉換爲int, 而後再移位,此時移位符號做用在32bit
        • 好比: (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位有效
相關文章
相關標籤/搜索