位運算是底層開發、高性能計算、網絡協議解析、加密算法等領域的核心技能。本文系統講解 Java 中的移位運算符、位邏輯運算符、掩碼構建技巧、Integer.parseInt 進制轉換、位級讀寫優化策略,並附帶直觀示例與性能分析。
| 運算符 | 名稱 | 規則 | 示例 | 結果 |
|---|---|---|---|---|
<< | 左移 | 低位補 0,高位丟棄,相當於 ×2ⁿ | 1 << 3 | 8 (0b1000) |
>> | 有符號右移 | 高位補符號位 (正補 0、負補 1),相當於 ÷2ⁿ (向下取整) | -16 >> 2 | -4 (0xFFFFFFFC) |
>>> | 無符號右移 | 高位固定補 0,忽略符號位 | -16 >>> 2 | 1073741820 (0x3FFFFFFF) |
關鍵差異: >> 保持符號,>>> 總是補 0。對正數兩者等價;負數 >>> 會變成巨大正數。
| 運算符 | 名稱 | 真值表 | 典型用途 |
|---|---|---|---|
~ | 按位取反 | 0→1, 1→0 | 構建掩碼、翻轉標誌位 |
& | 按位與 | 同為 1 才為 1 | 清零指定位、檢查標誌位 |
| | 按位或 | 有 1 即為 1 | 設置指定位、合併標誌位 |
^ | 按位異或 | 不同為 1 | 翻轉指定位、簡單加密、交換變量 |
int pow2(int n) { return 1 << n; } // 2ⁿ
int mask = 1 << 3; // 0b00001000 (第 3 位為 1)
value |= (1 << pos); // 第 pos 位設為 1
value |= (1 << 2) | (1 << 5); // 同時設置第 2、5 位
value &= ~(1 << pos); // 第 pos 位設為 0
value ^= (1 << pos); // 第 pos 位翻轉
boolean isSet = (value & (1 << pos)) != 0;
Java 整數為 32 位有符號,最高位 (bit 31) 為符號位。習慣將 bit 0 視為最低位 (LSB),值為 2⁰;bit 31 為最高位 (MSB),值為 2³¹ (符號位)。
bit 31 bit 0
1 0 0 1 0 1 1 0 ... 0 0 0 0
| |
MSB LSB (2⁰)
利用 Integer.parseInt(String, radix) 可在代碼中直接使用二進制/八進制/十六進制字面量:
int val = Integer.parseInt("1010", 2); // 10
int val2 = Integer.parseInt("FF", 16); // 255
// 甚至可在循環中遍歷二進制範圍
for (int b = Integer.parseInt("0101", 2); b <= Integer.parseInt("1111", 2); b++) {
// 處理 5 到 15
}
Java 標準 IO 流按字節 (8 位) 操作,處理位流 (如霍夫曼編碼、壓縮算法) 效率低。建議自定義 BitInputStream/BitOutputStream 提供:
readBits(int n):讀取下一個 n 位skipBits(int n):跳過 n 位假設編碼規則:0 開頭為 'a' (1 位),1 開頭 3 位分別對應 b/c/d/e。構建長度 8 (2³) 查表數組:
char[] code = new char[8];
int[] codelen = new int[8];
code[0]='a'; codelen[0]=1; // 000
code[1]='a'; codelen[1]=1; // 001
code[2]='a'; codelen[2]=1; // 010
code[3]='a'; codelen[3]=1; // 011
code[4]='b'; codelen[4]=3; // 100
code[5]='c'; codelen[5]=3; // 101
code[6]='d'; codelen[6]=3; // 110
code[7]='e'; codelen[7]=3; // 111
解碼邏輯:讀取 3 位作為索引 idx,直接 code[idx] 獲得字符,codelen[idx] 獲得實際位長,指針前移相應長度。兩次數組訪問替代逐位比對,極大提升解碼吞吐量。
<< >> >>> & | ^ ~ 七大運算符語義與優先級。Integer.parseInt 靈活處理不同進制字面量,提升代碼可讀性。Integer.toUnsignedString 等輔助方法),跨語言交互時需處理符號擴展。