2012-07-03 97 views
0

如何將位置信息存儲在位域中(域的順序是OR或否)?依賴於順序的位域

背景:昨天晚上寫了我的遊戲引擎的一部分,它突然進入我的腦海。假設我們試圖描述一種顏色,並且作爲描述符(和它們的順序)中存在的顏色的一部分。例如,我們今天對大多數顯卡下列顏色命令:

RGBA 
BGRA 

以下標誌可以用來描述所支持的顏色:

None = 0x0 
A = 0x1 
R = 0x2 
G = 0x4 
B = 0x8 

但是,通過使用這些字段A | R | G | B是與B | G | R | A一樣。您將如何設計可用於添加位置依賴性的標誌和/或操作?用於增加排他性的獎勵標記(例如,您不能在位置1處具有RG)和實用程序(可能在此情況下可能使用某種巧妙方式)。

+0

我並沒有考慮實際做到這一點,我只是覺得它很有趣。請不要評論「過早優化」。 –

+0

如果你想編碼*命令*,恕我直言的最自然的事情就是枚舉排列,並使用該編號。最自然的枚舉將是一個混合基數的東西(可能與Yates混洗) – wildplasser

+0

@wildplasser所以我假設你的意思是(A * 2^0)XOR(R * 3^1)XOR( G * 4^2)XOR(B * 5^3)'? –

回答

0

您可以在添加每個標誌之前移動位域,每個唯一標誌所需的位數。下列標誌將用於:

None = 0x0 
A = 0x1 
R = 0x2 
G = 0x4 
B = 0x8 
Shift = 0x4 
Mask = 0xF (A | R | G | B) 

在一個小端系統,您將各自OR之前接班向左Shift<<)。由於0 << x = 0可以消除None上的左移。由於原來的例子:

A1 = A 
A1R2 = (A1 << Shift) | R 
A1R2G3 = (A1R1 << Shift) | G 
A1R2G3B4 = (A1R1G3 << Shift) | B 

B1 = B 
B1G2 = (B1 << Shift) | G 
B1G2R3 = (B1G2 << Shift) | R 
B1G2R3A4 = (B1G2R3 << Shift) | A 

要提取每個(小端)它的位置,你會反覆轉移它的權利和ANDMask。重複此操作,直到當前值達到None會給你相反的順序。

let cur = the bit field we want to check 
loop until cur = None: 
    let val = cur AND Mask 
    emit the name of val 
    let cur = cur >> Shift 

這不提供排他性(您可以輕鬆地做一個AAGB),它看起來並不像它有任何效用。