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

C 語言位元運算完整指南:邏輯運算、移位、遮罩技巧與實戰範例

     編輯:關於C語言

位元邏輯運算子

運算子名稱規則典型用途
&位元 AND同為 1 結果 1清零特定位、檢測位狀態、保留特定位
|位元 OR任一為 1 結果 1設定特定位為 1、合併旗標
^位元 XOR相異為 1翻轉特定位、交換變數、簡單加密
~位元 NOT (補數)0↔1產生遮罩、翻轉所有位

核心遮罩口訣:「與零或一」

  • x & 0 = 0 (清零)
  • x & 1 = x (保留)
  • x | 0 = x (保留)
  • x | 1 = 1 (設 1)

所有位元操作皆可轉化為「決定遮罩 → 選擇 & 或 | → 執行」。

經典操作模式

  1. 取第 k 位 (0-index):(x >> k) & 1 或 (x & (1 << k)) != 0
  2. 設第 k 位為 1:x |= (1 << k)
  3. 清第 k 位為 0:x &= ~(1 << k)
  4. 翻轉第 k 位:x ^= (1 << k)
  5. 清除最低位的 1:x &= (x - 1) (判斷 2 的冪次:x & (x-1) == 0)
  6. 取最低位的 1:x & (-x) (二補數特性)

移位運算子

  • x << n:左移 n 位,低位補 0,等同 x * 2^n (無溢位前提)。
  • x >> n:右移 n 位。
    • 無號數:邏輯右移,高位補 0。
    • 有號數:算術右移 (保留符號位,高位補符號位),C 標準為實作定義,主流編譯器皆為算術右移。

實戰範例:計算整數二進制中 1 的個數

int countOnes(unsigned int x) {
    int cnt = 0;
    while (x) {
        x &= (x - 1); // 每次清除最低位的 1
        ++cnt;
    }
    return cnt; // Brian Kernighan 演算法,O(1 的個數)
}

硬體導向程式設計應用

  • 暫存器位欄位操作:REG |= (1 << BIT_ENABLE)、REG &= ~(1 << BIT_IRQ)
  • 通訊協定封包/解封包:位元組對齊、位欄位提取。
  • 壓縮儲存多布林旗標:uint32_t flags; #define FLAG_A 0x1。
  • 顏色通道操作:RGB565 = (R<<11) | (G<<5) | B。

注意事項

  1. 移位量 ≥ 位寬 (如 32 於 32-bit) 行為未定義。
  2. 有號數左移導致溢位為未定義行為。
  3. 位元運算優先級低於 `==`, `!=`, `+`, `-` 等,**務必加括號**:if ((x & MASK) == 0)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved