0

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

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

RGBA
BGRA

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

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

但是,通过使用这些字段A | R | G | BB | G | R | A. 您将如何设计可用于添加位置依赖性的标志和/或操作?添加排他性(例如,您不能在位置 1 中)和实用性(可以使用它的一些巧妙方式,可能在这种情况下)的奖励R标记G

4

1 回答 1

0

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

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

在 little-endian 系统上,您可以在 each 之前将其左移Shift( <<) ORNone可以消除左移,因为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),并且看起来它没有任何实用程序。

于 2012-07-03T10:14:44.710 回答