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

C語言位運算完全指南:從基礎邏輯到實戰技巧

     編輯:關於C語言

為什麼需要位運算?

計算機底層以二進制存儲數據。當數據對象狀態簡單(如開關、標誌位)或需直接操作硬體寄存器時,按位操作能極大節省內存並提升效率。C 語言作為系統級語言,原生提供完整的位運算支持。

核心位運算符一覽

運算符名稱類型優先級結合方向
~按位取反 (NOT)單目1 (最高)自右向左
<<, >>左移、右移雙目2自左向右
&按位與 (AND)雙目3自左向右
|按位或 (OR)雙目4自左向右
^按位異或 (XOR)雙目5 (最低)自左向右

注意: 位運算僅適用於整型(int、char、short、long 及其 unsigned 變體)。

按位邏輯運算詳解(以 16 位示例)

設 a = 0b1010100101010111,b = 0b0110000011111011

1. 按位與 & —— 「全 1 才 1」

a: 1010 1001 0101 0111
&  b: 0110 0000 1111 1011
--------------------------------
c: 0010 0000 0101 0011

應用: 屏蔽特定位(清零)、保留特定位、判斷奇偶(x & 1)。

2. 按位或 | —— 「有 1 即 1」

a: 1010 1001 0101 0111
|  b: 0110 0000 1111 1011
--------------------------------
c: 1110 1001 1111 1111

應用: 設置特定位為 1(如開啟設備標誌位)。

3. 按位異或 ^ —— 「相異為 1,相同為 0」

a: 1010 1001 0101 0111
^  b: 0110 0000 1111 1011
--------------------------------
c: 1100 1001 1010 1100

應用: 翻轉特定位、無暫存變量交換兩數(a ^= b; b ^= a; a ^= b;)、簡單加密/校驗。

4. 按位取反 ~ —— 「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: 低位丟棄。
    • 無符號數/正數:高位補 0(邏輯右移)。
    • 負數(有符號):高位補 1(算術右移,保持符號)。

例子: 7 << 2 = 28,7 >> 2 = 1。

位運算賦值運算符

簡化代碼:&= | = ^= <<= >>=

x &= y;   // 等同 x = x & y;
flags |= MASK; // 開啟標誌位

經典實戰案例

案例 1:屏蔽/提取位

// 取 n 的低 7 位
m = n & 0x7F;  // 0x7F = 0b01111111

案例 2:設置/清除/翻轉第 k 位(0-index)

x |= (1 << k);   // 設置第 k 位為 1
x &= ~(1 << k); // 清除第 k 位為 0
x ^= (1 << k);   // 翻轉第 k 位

案例 3:判斷 2 的冪次

bool isPowerOfTwo(int n) {
    return n > 0 && (n & (n - 1)) == 0;
}

避坑指南

  1. 優先級陷阱: &、|、^ 優先級低於 ==、< 等。習慣加括號:if ((x & MASK) == 0)。
  2. 符號擴展: char 有符號性實現定義,位運算前建議轉 unsigned char。
  3. 移位溢出: 移位位數 ≥ 位寬屬未定義行為(UB)。
  4. 別混淆邏輯運算: &&、|| 是短路邏輯,結果只能 0/1;&、| 是逐位運算,結果可為任意值。

掌握位運算,是邁向嵌入式開發、底層優化、协議解析的必修課。多動手實驗,體會「以空間換時間、以技巧換效率」的藝術。

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