計算機底層以二進制存儲數據。當數據對象狀態簡單(如開關、標誌位)或需直接操作硬體寄存器時,按位操作能極大節省內存並提升效率。C 語言作為系統級語言,原生提供完整的位運算支持。
| 運算符 | 名稱 | 類型 | 優先級 | 結合方向 |
|---|---|---|---|---|
~ | 按位取反 (NOT) | 單目 | 1 (最高) | 自右向左 |
<<, >> | 左移、右移 | 雙目 | 2 | 自左向右 |
& | 按位與 (AND) | 雙目 | 3 | 自左向右 |
| | 按位或 (OR) | 雙目 | 4 | 自左向右 |
^ | 按位異或 (XOR) | 雙目 | 5 (最低) | 自左向右 |
注意: 位運算僅適用於整型(int、char、short、long 及其 unsigned 變體)。
設 a = 0b1010100101010111,b = 0b0110000011111011
& —— 「全 1 才 1」a: 1010 1001 0101 0111
& b: 0110 0000 1111 1011
--------------------------------
c: 0010 0000 0101 0011
應用: 屏蔽特定位(清零)、保留特定位、判斷奇偶(x & 1)。
| —— 「有 1 即 1」a: 1010 1001 0101 0111
| b: 0110 0000 1111 1011
--------------------------------
c: 1110 1001 1111 1111
應用: 設置特定位為 1(如開啟設備標誌位)。
^ —— 「相異為 1,相同為 0」a: 1010 1001 0101 0111
^ b: 0110 0000 1111 1011
--------------------------------
c: 1100 1001 1010 1100
應用: 翻轉特定位、無暫存變量交換兩數(a ^= b; b ^= a; a ^= b;)、簡單加密/校驗。
~ —— 「0 變 1,1 變 0」 a: 1010 1001 0101 0111
~a: 0101 0110 1010 1000
關鍵結論: ~x = -x - 1(補碼表示下)。區別:-x 是取負,!x 是邏輯非(非 0 變 0,0 變 1)。
<< 與 >>x << n: 高位丟棄,低位補 0。等價於 x * 2^n(無溢出時)。x >> n: 低位丟棄。
例子: 7 << 2 = 28,7 >> 2 = 1。
簡化代碼:&= | = ^= <<= >>=
x &= y; // 等同 x = x & y;
flags |= MASK; // 開啟標誌位
// 取 n 的低 7 位
m = n & 0x7F; // 0x7F = 0b01111111
x |= (1 << k); // 設置第 k 位為 1
x &= ~(1 << k); // 清除第 k 位為 0
x ^= (1 << k); // 翻轉第 k 位
bool isPowerOfTwo(int n) {
return n > 0 && (n & (n - 1)) == 0;
}
&、|、^ 優先級低於 ==、< 等。習慣加括號:if ((x & MASK) == 0)。char 有符號性實現定義,位運算前建議轉 unsigned char。&&、|| 是短路邏輯,結果只能 0/1;&、| 是逐位運算,結果可為任意值。掌握位運算,是邁向嵌入式開發、底層優化、协議解析的必修課。多動手實驗,體會「以空間換時間、以技巧換效率」的藝術。