如何将位置信息存储在位字段中(字段为OR或其他方式的顺序)?
背景:昨晚我写了一部分游戏引擎时,它突然出现在了脑海里。假设我们试图描述一种颜色,作为其中的一部分,我们有描述符中存在的颜色(及其顺序)。例如,我们今天在大多数显卡上都有以下颜色顺序:
RGBA
BGRA
以下标志可用于描述支持的颜色:
None = 0x0
A = 0x1
R = 0x2
G = 0x4
B = 0x8
但是,使用这些字段A | R | G | B
与B | G | R | A
相同。您将如何设计可用于添加位置依赖性的标志和/或操作?用于添加排他性的奖励标记(例如,您不能在位置1中具有R
和G
)和用于实用程序(可以使用它的一些聪明方式,可能在这种情况下)。 / p>
答案 0 :(得分:0)
您可以在添加每个标志之前移位位字段,每个唯一标志所需的位数。将使用以下标志:
None = 0x0
A = 0x1
R = 0x2
G = 0x4
B = 0x8
Shift = 0x4
Mask = 0xF (A | R | G | B)
在小端系统上,您可以在每个Shift
之前将其向左移动<<
(OR
)。由于None
,0 << x = 0
上的左移可以消除。鉴于最初的例子:
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
要提取每个位置,您需要反复向右移动(小端)和AND
用Mask
。重复此操作直到当前值达到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)并且看起来它没有任何实用性。