Language agnostic 顺序相关位字段

Language agnostic 顺序相关位字段,language-agnostic,bit-manipulation,Language Agnostic,Bit Manipulation,如何在位字段中存储位置信息(字段的顺序是“或”还是“其他”) 背景:它昨晚在我写游戏引擎的一部分时突然出现在我的脑海里。假设我们试图描述一种颜色,作为其中的一部分,我们拥有描述符中存在的颜色(及其顺序)。例如,目前大多数图形卡上都有以下颜色订单: RGBA BGRA 以下标志可用于描述支持的颜色: None = 0x0 A = 0x1 R = 0x2 G = 0x4 B = 0x8 但是,通过使用这些字段A | R | G | B与B | G | R | A是一样的。如何设计可用于添加位置相

如何在位字段中存储位置信息(字段的顺序是“或”还是“其他”)

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

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

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

但是,通过使用这些字段
A | R | G | B
B | G | R | A
是一样的。如何设计可用于添加位置相关性的标志和/或操作?添加排他性(例如,位置1中不能有
R
G
)和实用性(可能在这种情况下,可以使用某种巧妙的方法)的额外标记。

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

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

在一个小的endian系统中,您可以将其向左移动
shift
我没有考虑实际这样做,我只是觉得这很有趣。请不要评论“过早优化”。如果你想编码顺序,最自然的事情是枚举排列,并使用该数字。最自然的枚举将是混合基数(可能与Yates shuffle组合)@所以我假设你是指
(A*2^0)XOR(R*3^1)XOR(G*4^2)XOR(B*5^3)
?不。原因是
4!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
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