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

C語言位運算符完全指南:&、|、^、~、<<、>> 實戰詳解與避坑

     編輯:關於C語言

六大運算符速查表

符號名稱規則典型用途
&按位與同為1得1清零、取指定位、掩碼
|按位或有1得1置位、合併標志位
^按位異或異為1,同為0翻轉位、無臨時變量交換、校驗
~取反0↔1構造掩碼、位取反
<<左移低位補0,高位丟棄快速乘 2ⁿ、構造位掩碼
>>右移無符號補0,有符號視實現定義(算術/邏輯移位)快速除 2ⁿ、提取高位

經典實戰技巧

1. 按位與 &:精準「手術刀」

  • 清零:x & 0xF0 保留高 4 位,低 4 位清零。
  • 取模替代:x % 8 == x & 7(2ⁿ 取模)。
  • 判斷奇偶:x & 1。
  • 檢查標志位:if (flags & MASK)。

2. 按位或 |:標志位「組合器」

  • flags |= MASK 置位,不影響其他位。
  • 權限組合:perm = READ | WRITE | EXEC。

3. 按位異或 ^:翻轉與交換

  • 翻轉指定位:x ^= MASK。
  • 無臨時變量交換:
    a ^= b; b ^= a; a ^= b;(注意:a==b 時會歸零,需加保護)。
  • 簡單校驗:異或累積作為校驗和。

4. 移位運算:乘除法加速器

  • x << n ≡ x * 2ⁿ(無溢出前提)。
  • x >> n ≡ x / 2ⁿ(無符號/正數)。
  • 構造掩碼:1 << n 得到第 n 位為 1 的掩碼。

5. 取反 ~:掩碼生成器

  • ~(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

避坑指南

  1. 有符號右移實現定義:算術移位(符號位擴展)vs 邏輯移位(補 0)。跨平台代碼用無符號類型或手動處理。
  2. 移位量 ≥ 位寬:行為未定義(C 標準)。確保 0 ≤ n < 位寬。
  3. 優先級陷阱:& | ^ 優先級低於 == !=,< > 等。習慣加括號:(a & b) == c。
  4. ~ 會提升類型:~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語言位運算符」筆記。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved