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

C語言位運算全解析:六大運算符與實戰技巧

     編輯:C 語言基礎

位運算符概覽

C 語言提供六大位運算符,直接操作二進制位,是系統編程、嵌入式開發、性能優化的利器。

運算符名稱功能優先級
&按位與對應位全 1 才為 1低
|按位或對應位有 1 即為 1低
^按位異或對應位不同為 1低
~按位取反0↔1 翻轉高(單目)
<<左移高位丟棄,低位補 0中
>>右移無符號補 0,有符號算術移位(符號位複製)中

逐個運算符詳解與實戰

1. 按位與 & — 掩碼、清零、保留位

9 & 5  // 00001001 & 00000101 = 00000001 (1)

// 實戰:保留低 8 位,清零高位
value = value & 0xFF;   // 或 value &= 0xFF;

// 實戰:判斷奇偶
if (n & 1) { /* 奇數 */ }

// 實戰:檢查某位是否為 1
#define BIT(n) (1U << (n))
if (flags & BIT(3)) { /* bit 3 已置位 */ }

2. 按位或 | — 置位、合成數值

9 | 5  // 00001001 | 00000101 = 00001101 (13)

// 實戰:置位
flags |= BIT(3);   // 設定 bit 3 為 1,其他位不變

// 實戰:合成 16 位值(高 8 位 + 低 8 位)
uint16_t val = (high << 8) | low;

3. 按位異或 ^ — 翻轉、交換、校驗

9 ^ 5  // 00001001 ^ 00000101 = 00001100 (12)

// 實戰:翻轉指定位
value ^= BIT(2);   // bit 2 翻轉

// 實戰:無臨時變量交換兩整數
a ^= b; b ^= a; a ^= b;

// 實戰:簡單校驗和
checksum ^= byte;

4. 按位取反 ~ — 生成掩碼、清零指定位

~9  // 1111111111110110 (假設 16 位)

// 實戰:清零指定位(配合 &)
value &= ~BIT(3);  // 將 bit 3 清 0,~BIT(3) 產生除 bit 3 外全 1 的掩碼

// 實戰:取絕對值(補碼技巧,僅供理解)
int mask = x >> (sizeof(int)*8 - 1);  // 符號位擴展
int abs = (x ^ mask) - mask;

5. 左移 << — 快速乘 2^n、構建掩碼

3 << 4  // 00000011 -> 00110000 (48)  等價 3 * 16

// 實戰:構建單一位掩碼
#define BIT(n) (1U << (n))   // 必須用無符號常量防止溢出 UB

// 實戰:將兩字節合成 16 位
uint16_t val = (high_byte << 8) | low_byte;

6. 右移 >> — 快速除 2^n、提取高位

15 >> 2  // 00001111 -> 00000011 (3)

// 有符號數算術右移:符號位複製
-8 >> 1  // 11111000 -> 11111100 (-4)  實現向下取整除 2

// 實戰:提取 16 位值的高低字節
high = (val >> 8) & 0xFF;
low  = val & 0xFF;

綜合實戰:字符打包/解包

// 將兩個 char 打包進一個 int(小端序)
char a = 'A', b = 'B';
int packed = a | (b << 8);  // 或 (b << 8) | a

// 解包
char c = packed & 0xFF;         // 低字節 'A'
char d = (packed >> 8) & 0xFF;  // 高字節 'B'
printf("c=%c, d=%c\n", c, d);   // 輸出 c=A, d=B

關鍵注意事項

  • 移位量:移位量 ≥ 位寬或 < 0 導致未定義行為。
  • 有符號左移:若結果溢出或符號位改變,屬 UB。優先用無符號類型進行位運算。
  • 右移實現:有符號數右移是算術移位(符號位複製)邏輯移位(補 0)由編譯器定義,不可移植假設。跨平台代碼請顯式轉 unsigned 再移位。
  • 優先級陷阱:& | ^ 優先級低於 == != < >,表達式務必加括號:if ((flags & MASK) == 0)。

總結

位運算是 C 語言貼近硬體的體現。熟練掌握 掩碼構建(1U< 三大模式,能在標誌位管理、網絡協議解析、圖像處理、加密算法等場景寫出極高效、極緊湊的代碼。

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