CSAPP 2.8 給定兩個 8 位位向量 a = 0110 1001、b = 0101 0101,要求計算 ~a、~b、a&b、a|b、a^b。這是位運算基礎功,也是掩碼提取、標誌位操作的核心技能。
a = 0110 1001 (0x69) b = 0101 0101 (0x55)
| 運算 | 二進制結果 | 十六進制 | 十進制 | 逐位邏輯 |
|---|---|---|---|---|
~a (非) | 1001 0110 | 0x96 | 150 | 逐位取反 |
~b (非) | 1010 1010 | 0xAA | 170 | 逐位取反 |
a & b (與) | 0100 0001 | 0x41 | 65 | 同為 1 才為 1 |
a | b (或) | 0111 1101 | 0x7D | 125 | 任一為 1 即為 1 |
a ^ b (異或) | 0011 1100 | 0x3C | 60 | 不同為 1,相同為 0 |
位位置: 7 6 5 4 3 2 1 0 a: 0 1 1 0 1 0 0 1 b: 0 1 0 1 0 1 0 1 a&b: 0 1 0 0 0 0 0 1 → 0x41
| 目標 | 表達式 | 示例 |
|---|---|---|
| 置位第 k 位 | x |= (1u << k) | 啟用標誌位 |
| 清零第 k 位 | x &= ~(1u << k) | 禁用標誌位 |
| 翻轉第 k 位 | x ^= (1u << k) | 切換狀態 |
| 檢測第 k 位 | (x >> k) & 1 或 x & (1u << k) | 條件判斷 |
| 取低 k 位 | x & ((1u << k) - 1) | 模 2^k |
| 清零最低 1 | x & (x - 1) | 計算 1 的個數 |
| 隔離最低 1 | x & -x | 低位提取 |
1 << k 若 k >= 32 為未定義行為(32 位 int),用 1uLL << k。unsigned 類型。& 低於 ==,寫 if ((x & MASK) == 0) 而非 if (x & MASK == 0)。熟練掌握 8 位向量的五大基本運算,是寫出高效、無分支、位級精確代碼的基石。