七大位運算符速查表
| 運算符 | 名稱 | 規則 | 範例 (二進制) | 結果 |
& | 位元 AND | 同為 1 → 1,否則 0 | 101 & 111 = 101 | 5 |
| | 位元 OR | 有 1 → 1,全 0 → 0 | 101 | 010 = 111 | 7 |
^ | 位元 XOR | 相同 → 0,不同 → 1 | 101 ^ 010 = 111 | 7 |
~ | 位元 NOT | 0↔1 翻轉 (補數) | ~001 = ...110 | -2 |
<< | 算術左移 | 低位補 0,高位捨棄 | 011 << 1 = 110 | 6 |
>> | 算術右移 | 高位補符號位 (保持正負) | 110 >> 1 = 111 (-2) | -2 |
>>> | 邏輯右移 | 高位補 0 (無符號) | 110 >>> 1 = 011 | 3 |
詳細範例與補碼解析
Java 整數採用二補數表示:最高位為符號位 (0 正、1 負),負數 = 正數按位取反 + 1。
1. & (AND) - 遮罩/檢測位元
int i = 1; // 000...001
int j = 2; // 000...010
int n = i & j; // 000...000 = 0
System.out.println(n); // 0
// 實戰:判斷奇偶 (最低位)
boolean isOdd = (num & 1) == 1;
// 實戰:清除特定位元
flags = flags & ~MASK;
2. | (OR) - 設定位元/合併旗標
int i = 1; // 001
int j = 2; // 010
int n = i | j; // 011 = 3
System.out.println(n); // 3
// 實戰:設定旗標
permissions = permissions | READ | WRITE;
// 實戰:合併選項
int options = OPTION_A | OPTION_C;
3. ^ (XOR) - 切換位元/交換變數/簡單加密
int a = 5, b = 3;
a = a ^ b; // a=6
b = a ^ b; // b=5
a = a ^ b; // a=3 (無需暫存變數交換)
// 實戰:切換旗標
flags = flags ^ TOGGLE_MASK;
// 實戰:簡單校驗和
checksum ^= data[i];
4. ~ (NOT) - 取反/建立遮罩
int i = 1; // 000...001
int j = ~i; // 111...110 = -2 (補碼)
System.out.println(j); // -2
// 實戰:建立清除遮罩
int mask = ~(1 << 3); // 除了第 3 位全 1
value = value & mask; // 清除第 3 位
5. << (左移) - 快速乘 2^n
int i = 5; // 101
int j = i << 2; // 10100 = 20 (5 * 4)
System.out.println(j); // 20
// 溢位範例
int max = Integer.MAX_VALUE; // 0111...111
int overflow = max << 1; // 1111...110 = -2
// 移位量模 32:i << 32 等同 i << 0
6. >> (算術右移) - 快速除 2^n (保持符號)
int pos = 20; // 000...10100
int neg = -20; // 111...01100 (補碼)
System.out.println(pos >> 2); // 5 (20/4)
System.out.println(neg >> 2); // -5 (-20/4,符號位延伸)
// 移位量模 32
System.out.println(5 >> 32); // 5 (32%32=0)
7. >>> (邏輯右移) - 無符號右移
int pos = 20; // 000...10100
int neg = -2; // 111...11110
System.out.println(pos >>> 1); // 10
System.out.println(neg >>> 1); // 2147483647 (最高位補 0,變巨大正數)
// 無負數概念,適合處理無符號資料 (如網路協定、圖像像素)
實戰應用場景
| 場景 | 技巧 | 程式碼範例 |
| 權限/旗標管理 | 位元組合 | READ=1, WRITE=2, EXEC=4; perm = READ | WRITE; |
| 高效乘除 2^n | 移位替代乘除 | x << 3 == x * 8; x >> 2 == x / 4 |
| 快速交換 | XOR 交換 | a ^= b; b ^= a; a ^= b; |
| 循環緩衝區索引 | 位元 AND 取模 | index = (index + 1) & (SIZE - 1); // SIZE 必須是 2^n |
| 顏色通道提取 | 移位 + 遮罩 | red = (rgb >> 16) & 0xFF; green = (rgb >> 8) & 0xFF; |
| 子集枚舉 | 位元遍歷 | for (int mask = 0; mask < (1<<n); mask++) { ... } |
| Bloom Filter / BitSet | 位元陣列 | BitSet bits = new BitSet(); bits.set(hash); |
注意事項
int 移位量實際取 mask & 0x1F (模 32);long 取 mask & 0x3F (模 64)
- 位運算優先級:
~ > <</>>/>>> > & > ^ > |,建議多用括號
>>> 無對應的 <<< (左移已無符號區別)
- 負數右移行為:
>> 保持負數,>>> 轉為大正數