Java中的移位運算

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位有效
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章