依赖于顺序的位字段

时间:2012-07-03 10:14:44

标签: language-agnostic bit-manipulation

如何将位置信息存储在位字段中(字段为OR或其他方式的顺序)?

背景:昨晚我写了一部分游戏引擎时,它突然出现在了脑海里。假设我们试图描述一种颜色,作为其中的一部分,我们有描述符中存在的颜色(及其顺序)。例如,我们今天在大多数显卡上都有以下颜色顺序:

RGBA
BGRA

以下标志可用于描述支持的颜色:

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

但是,使用这些字段A | R | G | BB | G | R | A相同。您将如何设计可用于添加位置依赖性的标志和/或操作?用于添加排他性的奖励标记(例如,您不能在位置1中具有RG)和用于实用程序(可以使用它的一些聪明方式,可能在这种情况下)。 / p>

1 个答案:

答案 0 :(得分:0)

您可以在添加每个标志之前移位位字段,每个唯一标志所需的位数。将使用以下标志:

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

在小端系统上,您可以在每个Shift之前将其向左移动<<OR)。由于None0 << 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

要提取每个位置,您需要反复向右移动(小端)和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)并且看起来它没有任何实用性。