CSAPP 2.9 將 RGB 顏色建模為 3 位位向量(R、G、B 各 1 位),共 8 種顏色。通過布爾運算探索補色關係與顏色混合邏輯,直觀展示位運算在圖形學中的應用。
| R | G | B | 顏色 | 十六進制 |
|---|---|---|---|---|
| 0 | 0 | 0 | 黑色 | 0x0 |
| 0 | 0 | 1 | 藍色 | 0x1 |
| 0 | 1 | 0 | 綠色 | 0x2 |
| 0 | 1 | 1 | 青色 (藍綠) | 0x3 |
| 1 | 0 | 0 | 紅色 | 0x4 |
| 1 | 0 | 1 | 品紅 (紅藍) | 0x5 |
| 1 | 1 | 0 | 黃色 (紅綠) | 0x6 |
| 1 | 1 | 1 | 白色 | 0x7 |
補色定義:關閉原開啟的分量,開啟原關閉的分量 → 即按位非運算。
| 顏色 | RGB | 補色 | 補色 RGB | 驗證 (~color & 0x7) |
|---|---|---|---|---|
| 黑色 | 000 | 白色 | 111 | ~0 & 7 = 7 ✅ |
| 紅色 | 100 | 青色 | 011 | ~4 & 7 = 3 ✅ |
| 綠色 | 010 | 品紅 | 101 | ~2 & 7 = 5 ✅ |
| 藍色 | 001 | 黃色 | 110 | ~1 & 7 = 6 ✅ |
| 青色 | 011 | 紅色 | 100 | ~3 & 7 = 4 ✅ |
| 品紅 | 101 | 綠色 | 010 | ~5 & 7 = 2 ✅ |
| 黃色 | 110 | 藍色 | 001 | ~6 & 7 = 1 ✅ |
| 白色 | 111 | 黑色 | 000 | ~7 & 7 = 0 ✅ |
注意:~ 運算會翻轉所有 32/64 位,需 & 0x7 截取低 3 位。
| 運算 | 表達式 | 二進制過程 | 結果顏色 | 視覺含義 |
|---|---|---|---|---|
| 或 (|) | 藍色 | 綠色 | 001 | 010 = 011 | 青色 | 加色混合:光疊加 |
| 與 (&) | 黃色 & 青色 | 110 & 011 = 010 | 綠色 | 共同分量:交集 |
| 異或 (^) | 紅色 ^ 品紅 | 100 ^ 101 = 001 | 藍色 | 差異分量:對稱差 |
// 24 位 RGB: 0xRRGGBB
#define RED(c) (((c) >> 16) & 0xFF)
#define GREEN(c) (((c) >> 8) & 0xFF)
#define BLUE(c) ((c) & 0xFF)
// 補色(每通道 255 - 值)
uint32_t complement(uint32_t c) {
return 0xFFFFFF ^ c; // 等價於 ~c & 0xFFFFFF
}
// 疊加混合(飽和加法,簡化版)
uint32_t blend_add(uint32_t a, uint32_t b) {
uint32_t r = RED(a) + RED(b);
uint32_t g = GREEN(a) + GREEN(b);
uint32_t b_ = BLUE(a) + BLUE(b);
return ((r>255?255:r)<<16) | ((g>255?255:g)<<8) | (b_>255?255:b_);
}
CSAPP 2.9 用最小位寬(3 位)構建完整顏色代數,讓你在位運算與視覺感知之間建立直觀連接。