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

CSAPP 習題 2.9 解答:RGB 三原色位向量布爾運算與補色關係

     編輯:關於C語言

CSAPP 習題 2.9 解答:RGB 三原色位向量布爾運算與補色關係

CSAPP 2.9 將 RGB 顏色建模為 3 位位向量(R、G、B 各 1 位),共 8 種顏色。通過布爾運算探索補色關係與顏色混合邏輯,直觀展示位運算在圖形學中的應用。

8 種基礎顏色編碼

RGB顏色十六進制
000黑色0x0
001藍色0x1
010綠色0x2
011青色 (藍綠)0x3
100紅色0x4
101品紅 (紅藍)0x5
110黃色 (紅綠)0x6
111白色0x7

A. 補色關係(按位取反 ~)

補色定義:關閉原開啟的分量,開啟原關閉的分量 → 即按位非運算。

顏色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 位。

B. 顏色混合布爾運算

運算表達式二進制過程結果顏色視覺含義
或 (|)藍色 | 綠色001 | 010 = 011青色加色混合:光疊加
與 (&)黃色 & 青色110 & 011 = 010綠色共同分量:交集
異或 (^)紅色 ^ 品紅100 ^ 101 = 001藍色差異分量:對稱差

擴展:24 位真彩色中的位運算

// 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_);
}

核心洞見

  1. 補色 = 按位非(在固定位寬下),這是加色模型(光)的直接數學推論。
  2. | = 光疊加、& = 共同成分、^ = 差異成分,位運算完美映射加色混合邏輯。
  3. 真彩色中每通道 8 位,運算需防溢出(飽和運算或浮點線性插值)。

CSAPP 2.9 用最小位寬(3 位)構建完整顏色代數,讓你在位運算與視覺感知之間建立直觀連接。

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