Java 位運算完全指南
一、二進制補碼表示
- 最高位為符號位:0 正數、1 負數
- 負數補碼 = 絕對值按位取反 + 1
- 例:-5 → 00000101 → 11111010 + 1 = 11111011
二、位運算符分類與規則
| 運算符 | 名稱 | 規則 | 範例 (5=0101, 3=0011) |
<< | 左移 | 低位補 0,高位捨棄 | 5 << 2 = 20 (10100) |
>> | 算術右移 | 高位補符號位 | 5 >> 2 = 1; -5 >> 2 = -2 |
>>> | 邏輯右移 | 高位補 0(無符號) | -5 >>> 2 = 1073741822 |
& | 按位與 | 同為 1 結果 1 | 5 & 3 = 1 (0001) |
| | 按位或 | 任一為 1 結果 1 | 5 | 3 = 7 (0111) |
^ | 按位異或 | 相異為 1,相同為 0 | 5 ^ 3 = 6 (0110) |
~ | 按位非 | 逐位取反 | ~5 = -6 |
三、移位運算細節
int/long:右側保留 5/6 位(模 32/64)
byte/short/char:自動提升為 int 再移位
- 左移 1 位 ≈ ×2,右移 1 位 ≈ ÷2(效率高於乘除)
四、運算符優先級(高→低)
~ > << >> >>> > & > ^ > |
五、異或 (^) 實戰技巧
- 翻轉指定位:
x ^ mask(mask 對應位為 1)
- 無臨時變數交換:
a = a ^ b; b = a ^ b; a = a ^ b;
- 自檢屬性:
a ^ a = 0,a ^ 0 = a
六、與、或 實戰技巧
& 屏蔽/取位:x & 0xFF 取低 8 位
| 置位:x | 0x01 將第 0 位設為 1
七、非十進制字面值表示法
| 進制 | 前綴 | 範例 | 說明 |
| 八進制 | 0 | 0144 (=100) | 數字 0-7 |
| 十六進制 | 0x / 0X | 0xFF (=255) | 數字 0-9, A-F (不分大小寫) |
| 二進制 | 0b (JDK 7+) | 0b1010 (=10) | 僅 0/1 |
注意:八/十六進制字面值視為無符號正數,-0xFF 是一元負號運算,非字面值一部分。
八、完整程式碼驗證
public class BitwiseDemo {
public static void main(String[] args) {
System.out.println(5 << 2); // 20
System.out.println(5 >> 2); // 1
System.out.println(-5 >> 2); // -2
System.out.println(-5 >>> 2); // 1073741822
System.out.println(5 & 3); // 1
System.out.println(5 | 3); // 7
System.out.println(5 ^ 3); // 6
System.out.println(~5); // -6
// 判斷長整數第 4 位 (從 0 開始)
long a = 123; // 1111011
int bit = (int)((a >> 4) & 1); // 1
System.out.println("第 4 位: " + bit);
}
}