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

Java 位運算符完整指南:&、|、^、~、<<、>>、>>> 詳解與實戰技巧

     編輯:Java 綜合教學

七大位運算符速查表

運算符名稱規則範例 (二進制)結果
&位元 AND同為 1 → 1,否則 0101 & 111 = 1015
|位元 OR有 1 → 1,全 0 → 0101 | 010 = 1117
^位元 XOR相同 → 0,不同 → 1101 ^ 010 = 1117
~位元 NOT0↔1 翻轉 (補數)~001 = ...110-2
<<算術左移低位補 0,高位捨棄011 << 1 = 1106
>>算術右移高位補符號位 (保持正負)110 >> 1 = 111 (-2)-2
>>>邏輯右移高位補 0 (無符號)110 >>> 1 = 0113

詳細範例與補碼解析

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)
  • 位運算優先級:~ > <</>>/>>> > & > ^ > |,建議多用括號
  • >>> 無對應的 <<< (左移已無符號區別)
  • 負數右移行為:>> 保持負數,>>> 轉為大正數
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved