<<、>>、>>> 與補碼機制Java 移位操作僅適用於 int 和 long;byte、short、char 會先提升為 int 再移位。三種運算符:
<< 左移:低位補 0,符號位參與移動。>> 帶符號右移:正數高位補 0,負數高位補 1(符號位延伸)。>>> 無符號右移:無論正負,高位均補 0。注意:無 <<< 運算符;移位不循環(移出的位丟棄)。所有運算基於二進制補碼進行。
public class Shift {
public static void main(String[] args) {
System.out.println("=== 正數左移低位補0 ===");
int a = 1;
a = a << 2; // 4 -> 100
System.out.println(a);
System.out.println(Integer.toBinaryString(a));
System.out.println("=== 正數右移高位補0 ===");
a = 1;
a = a >> 2; // 0
System.out.println(a);
System.out.println(Integer.toBinaryString(a));
System.out.println("=== 負數右移高位補1 ===");
int i = -1; // 32個1
System.out.println(i + ": " + Integer.toBinaryString(i));
i = i >> 2; // 仍為 -1
System.out.println(i + ": " + Integer.toBinaryString(i));
System.out.println("=== 負數左移低位補0 ===");
i = i << 2; // -4 -> ...11111100
System.out.println(i);
System.out.println(Integer.toBinaryString(i));
System.out.println("=== >>> 無符號右移高位補0 ===");
i = -1;
System.out.println(Integer.toBinaryString(i));
i = i >>> 10; // 4194303 -> 22個1
System.out.println(i + ": " + Integer.toBinaryString(i));
System.out.println("=== byte 類型移位需強轉 ===");
byte k = 10; // 1010
System.out.println(Integer.toBinaryString(k));
k = (byte) (k >>> 2); // 10 -> 2
System.out.println(Integer.toBinaryString(k));
}
}
<< 相當於乘 2n,>> 相當於除 2n(向下取整)。>> 保持符號,>>> 會變為大正數。byte、short、char 移位前先提升為 int,結果需強制轉回原類型。