Java 提供三種位移運算符,僅支援整數型別 (byte, short, char, int, long)。運算前會將 byte/short/char 提升為 int,long 保持長整數。
| 運算符 | 名稱 | 規則 | 等價數學運算 |
|---|---|---|---|
<< | 左移 | 二進制向左移動 n 位,低位補 0,高位捨棄 | × 2ⁿ (無溢位時) |
>> | 有號右移 (算術右移) | 二進制向右移動 n 位,高位補符號位 (正數補 0,負數補 1) | ÷ 2ⁿ (向零取整) |
>>> | 無號右移 (邏輯右移) | 二進制向右移動 n 位,高位固定補 0 | 無號整數 ÷ 2ⁿ |
為防止移位位數過大,JVM 實際移位位數為:
int:n % 32 (即 n & 0x1F)long:n % 64 (即 n & 0x3F)int a = 16;
a << 34 == a << 2 // 34 % 32 = 2
a >> 33 == a >> 1 // 33 % 32 = 1
public class ShiftOperatorDemo {
public static void main(String[] args) {
int a = 16; // 二進制: 10000
int left = a << 2; // 1000000 = 64
int right = a >> 2; // 100 = 4
int unsignedRight = a >>> 2; // 正數同有號右移
System.out.println("原值: " + a + " -> " + Integer.toBinaryString(a));
System.out.println("左移2: " + left + " -> " + Integer.toBinaryString(left));
System.out.println("右移2: " + right + " -> " + Integer.toBinaryString(right));
System.out.println("無號右移2: " + unsignedRight);
// 負數示範
int neg = -16; // 二進制補碼: 11111111 11111111 11111111 11110000
System.out.println("\n負數 -16:");
System.out.println("有號右移2: " + (neg >> 2) + " -> " + Integer.toBinaryString(neg >> 2));
System.out.println("無號右移2: " + (neg >>> 2) + " -> " + Integer.toBinaryString(neg >>> 2));
}
}
原值: 16 -> 10000
左移2: 64 -> 1000000
右移2: 4 -> 100
無號右移2: 4
負數 -16:
有號右移2: -4 -> 11111111111111111111111111111100
無號右移2: 1073741820 -> 00111111111111111111111111111100
int x = 100;
int mul4 = x << 2; // 400
int div8 = x >> 3; // 12 (向零取整)
// 定義權限旗標
int READ = 1 << 0; // 0001
int WRITE = 1 << 1; // 0010
int EXEC = 1 << 2; // 0100
int perm = READ | WRITE; // 0011 = 3
boolean canRead = (perm & READ) != 0; // true
boolean canExec = (perm & EXEC) != 0; // false
perm |= EXEC; // 新增執行權限
perm &= ~WRITE; // 移除寫入權限
int color = 0xFF336699; // Alpha=FF, Red=33, Green=66, Blue=99
int alpha = (color >> 24) & 0xFF; // 255
int red = (color >> 16) & 0xFF; // 51
int green = (color >> 8) & 0xFF; // 102
int blue = color & 0xFF; // 153
int mid = (low + high) >>> 1; // 無號右移等同 (low+high)/2 但不溢位
// 或: int mid = low + ((high - low) >> 1);
boolean isPowerOfTwo(int n) {
return n > 0 && (n & (n - 1)) == 0;
}
<<< 運算符:左移不分有號/無號,高位捨棄,低位補 0。>> 保持符號 (負數仍為負),>>> 一定變正數。1L << 60 避免 int 溢位。a <<= 2 等同 a = a << 2,但 a 只求值一次。