| 符號 | 名稱 | 規則 | 典型用途 |
|---|---|---|---|
& | 按位與 | 同為1得1 | 清零、取指定位、掩碼 |
| | 按位或 | 有1得1 | 置位、合併標志位 |
^ | 按位異或 | 異為1,同為0 | 翻轉位、無臨時變量交換、校驗 |
~ | 取反 | 0↔1 | 構造掩碼、位取反 |
<< | 左移 | 低位補0,高位丟棄 | 快速乘 2ⁿ、構造位掩碼 |
>> | 右移 | 無符號補0,有符號視實現定義(算術/邏輯移位) | 快速除 2ⁿ、提取高位 |
&:精準「手術刀」x & 0xF0 保留高 4 位,低 4 位清零。x % 8 == x & 7(2ⁿ 取模)。x & 1。if (flags & MASK)。|:標志位「組合器」flags |= MASK 置位,不影響其他位。perm = READ | WRITE | EXEC。^:翻轉與交換x ^= MASK。a ^= b; b ^= a; a ^= b;(注意:a==b 時會歸零,需加保護)。x << n ≡ x * 2ⁿ(無溢出前提)。x >> n ≡ x / 2ⁿ(無符號/正數)。1 << n 得到第 n 位為 1 的掩碼。~:掩碼生成器~(1 << n) → 除第 n 位外全 1,用於 x &= ~(1<<n) 清零第 n 位。~0 → 全 1 掩碼(UINT_MAX)。a &= b; // a = a & b a |= b; // a = a | b a ^= b; // a = a ^ b a <<= n; // a = a << n a >>= n; // a = a >> n
0 ≤ n < 位寬。& | ^ 優先級低於 == !=,< > 等。習慣加括號:(a & b) == c。~ 會提升類型:~0 是 int,配合無符號變量可能觸發符號擴展,建議 (unsigned)~0 或 ~0u。typedef unsigned int BitSet;
#define SET_ADD(s, x) ((s) |= (1u << (x)))
#define SET_DEL(s, x) ((s) &= ~(1u << (x)))
#define SET_HAS(s, x) ((s) & (1u << (x)))
#define SET_TOGGLE(s, x) ((s) ^= (1u << (x)))
int main() {
BitSet s = 0;
SET_ADD(s, 3); SET_ADD(s, 5);
printf("Has 3: %d, Has 4: %d\n", SET_HAS(s,3), SET_HAS(s,4));
SET_TOGGLE(s, 3);
printf("After toggle 3: %d\n", SET_HAS(s,3));
return 0;
}
位運算是系統級編程、嵌入式開發、高性能計算的基石。掌握六大運算符語義、優先級、類型提升規則與經典組合模式(掩碼、標志位、交換、乘除優化),能寫出既高效又優雅的代碼。本文整理自 51CTO 技術博客「C語言位運算符」筆記。