1. 程式人生 > >移位操作符

移位操作符

ron short 操作數 分類 block 不能 class ring 操作符

移位操作符

  • byte short char等類型進行移位前會先轉換成int型
  • long 型轉換前後皆為long
  • 符號左邊為操作數,右邊為操作數向左或向右移動的位數
  • 移位 可與 等號組合使用
  • eg.>>= 先移位再賦值給左邊的變量

分類:

  • 左移位操作符 << :向左移動,低位補0
  • 有符號右移位操作符 >> :向右移動,負數高位補1,正數高位補0
  • 無符號右移位操作符 >>>:向右移動,高位補0 (c++/c 中都沒有)

舉例

public class Main {
    public static void main(String[] args) {
        int i = 100;
        System.out.println(Integer.toBinaryString(i));
        System.out.println(Integer.toBinaryString(-i));
        System.out.println(Integer.toBinaryString(i << 4));
        System.out.println(Integer.toBinaryString(-i << 4));
        System.out.println(Integer.toBinaryString(i >> 4));
        System.out.println(Integer.toBinaryString(-i >> 4));
        System.out.println(Integer.toBinaryString(i >>> 4));
        System.out.println(Integer.toBinaryString(-i >>> 4));
    }
}

result:
1100100
11111111111111111111111110011100
11001000000
11111111111111111111100111000000
110
11111111111111111111111111111001
110
1111111111111111111111111001
  • think in java 中提到 只有數值右端的低5位才有用,這樣可防止我們移位超過int型值所具有的位數
  • 因為int型占4字節,共32位,也就是說,一個操作數最多移動32位就毫無意義了,所以移位運算符右端的數字最大不能超過32位,即最大11111,一個數的低五位即可表示。
  • 如果運算符右端的數字大於等於32,則可通過取32的模來得到真正需要移動的位數,eg. 1>>34,右邊的34>32,因此需要讓34對32取余,結果為34%32=2,因此真正的移位運算應該是1>>2
  • 同理long型占8字節,共64位,運算符右端數值的低6位對應的十進制才是有效移動位數。

移位操作符