C 語言提供六大位運算符,直接操作二進制位,是系統編程、嵌入式開發、性能優化的利器。
| 運算符 | 名稱 | 功能 | 優先級 |
|---|---|---|---|
& | 按位與 | 對應位全 1 才為 1 | 低 |
| | 按位或 | 對應位有 1 即為 1 | 低 |
^ | 按位異或 | 對應位不同為 1 | 低 |
~ | 按位取反 | 0↔1 翻轉 | 高(單目) |
<< | 左移 | 高位丟棄,低位補 0 | 中 |
>> | 右移 | 無符號補 0,有符號算術移位(符號位複製) | 中 |
& — 掩碼、清零、保留位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 已置位 */ }
| — 置位、合成數值9 | 5 // 00001001 | 00000101 = 00001101 (13)
// 實戰:置位
flags |= BIT(3); // 設定 bit 3 為 1,其他位不變
// 實戰:合成 16 位值(高 8 位 + 低 8 位)
uint16_t val = (high << 8) | low;
^ — 翻轉、交換、校驗9 ^ 5 // 00001001 ^ 00000101 = 00001100 (12)
// 實戰:翻轉指定位
value ^= BIT(2); // bit 2 翻轉
// 實戰:無臨時變量交換兩整數
a ^= b; b ^= a; a ^= b;
// 實戰:簡單校驗和
checksum ^= byte;
~ — 生成掩碼、清零指定位~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;
<< — 快速乘 2^n、構建掩碼3 << 4 // 00000011 -> 00110000 (48) 等價 3 * 16
// 實戰:構建單一位掩碼
#define BIT(n) (1U << (n)) // 必須用無符號常量防止溢出 UB
// 實戰:將兩字節合成 16 位
uint16_t val = (high_byte << 8) | low_byte;
>> — 快速除 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
unsigned 再移位。& | ^ 優先級低於 == != < >,表達式務必加括號:if ((flags & MASK) == 0)。位運算是 C 語言貼近硬體的體現。熟練掌握 掩碼構建(1U<