<<

  • <<: 左移運算,左移幾位就補幾個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位有效