首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 位運算完全指南:移位、掩碼、解析與高性能技巧

     編輯:Java 相關知識

位運算是底層開發、高性能計算、網絡協議解析、加密算法等領域的核心技能。本文系統講解 Java 中的移位運算符、位邏輯運算符、掩碼構建技巧、Integer.parseInt 進制轉換、位級讀寫優化策略,並附帶直觀示例與性能分析。

移位運算符

運算符名稱規則示例結果
<<左移低位補 0,高位丟棄,相當於 ×2ⁿ1 << 38 (0b1000)
>>有符號右移高位補符號位 (正補 0、負補 1),相當於 ÷2ⁿ (向下取整)-16 >> 2-4 (0xFFFFFFFC)
>>>無符號右移高位固定補 0,忽略符號位-16 >>> 21073741820 (0x3FFFFFFF)

關鍵差異: >> 保持符號,>>> 總是補 0。對正數兩者等價;負數 >>> 會變成巨大正數。

位邏輯運算符

運算符名稱真值表典型用途
~按位取反0→1, 1→0構建掩碼、翻轉標誌位
&按位與同為 1 才為 1清零指定位、檢查標誌位
|按位或有 1 即為 1設置指定位、合併標誌位
^按位異或不同為 1翻轉指定位、簡單加密、交換變量

掩碼構建與位操作實戰

1. 快速求 2 的冪次

int pow2(int n) { return 1 << n; } // 2ⁿ

2. 創建單一位掩碼

int mask = 1 << 3; // 0b00001000 (第 3 位為 1)

3. 設置位 (置 1)

value |= (1 << pos); // 第 pos 位設為 1
value |= (1 << 2) | (1 << 5); // 同時設置第 2、5 位

4. 清零位 (置 0)

value &= ~(1 << pos); // 第 pos 位設為 0

5. 翻轉位

value ^= (1 << pos); // 第 pos 位翻轉

6. 讀取位

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 進制解析技巧

利用 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] 獲得實際位長,指針前移相應長度。兩次數組訪問替代逐位比對,極大提升解碼吞吐量。

總結

  1. 熟練掌握 << >> >>> & | ^ ~ 七大運算符語義與優先級。
  2. 掩碼操作 (設置/清零/翻轉/讀取) 是位運算最核心應用模式,務必形成肌肉記憶。
  3. 利用 Integer.parseInt 靈活處理不同進制字面量,提升代碼可讀性。
  4. 高性能場景下,自定義位流類 + 查表法解碼是標準優化路徑。
  5. 注意 Java 無無符號類型 (Java 8+ 提供 Integer.toUnsignedString 等輔助方法),跨語言交互時需處理符號擴展。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved