位元運算是直接對整數的二進位表示進行操作,效率極高,常用於效能敏感場景、旗標處理、加密演算法等領域。Java 提供六種位元運算子:左移(<<)、右移(>>)、無符號右移(>>>)、位元 AND(&)、位元 OR(|)、位元 XOR(^)與位元 NOT(~)。
public class BitwiseDemo {
public static void main(String[] args) {
// 1. 左移運算子 (<<)
// 5 的二進位:0000 0101,左移 2 位 → 0001 0100 (十進位 20)
System.out.println("5 << 2 = " + (5 << 2)); // 輸出 20
// 2. 右移運算子 (>>) - 保留符號位
// 5 右移 2 位 → 0000 0001 (十進位 1)
System.out.println("5 >> 2 = " + (5 >> 2)); // 輸出 1
// 3. 無符號右移運算子 (>>>) - 高位補 0
System.out.println("5 >>> 3 = " + (5 >>> 3)); // 0
System.out.println("-5 >> 3 = " + (-5 >> 3)); // -1 (算術右移)
System.out.println("-5 >>> 3 = " + (-5 >>> 3)); // 536870911 (邏輯右移)
// 4. 位元 AND (&)
// 只有雙方都是 1 才為 1
System.out.println("5 & 3 = " + (5 & 3)); // 1 (0101 & 0011 = 0001)
System.out.println("4 & 1 = " + (4 & 1)); // 0 (0100 & 0001 = 0000)
// 5. 位元 OR (|)
// 任一方為 1 即為 1
System.out.println("5 | 3 = " + (5 | 3)); // 7 (0101 | 0011 = 0111)
// 6. 位元 XOR (^)
// 相同為 0,不同為 1
System.out.println("5 ^ 3 = " + (5 ^ 3)); // 6 (0101 ^ 0011 = 0110)
// 7. 位元 NOT (~)
// 逐位取反
System.out.println("~5 = " + (~5)); // -6 (補碼表示)
}
}
x << 3 比 x * 8 更快& 檢查、| 設定、^ 切換、~& 清除特定位(n & 1) == 1 判斷奇數a ^= b; b ^= a; a ^= b; 無需暫存變數x % 2^n == x & (2^n - 1)Java 使用二補數表示負數:
例如 -5:5 = 0000...0101 → 取反 1111...1010 → 加 1 → 1111...1011
int 為 32 位,long 為 64 位,移位量會模 32 或 64