0

位置情報をビットフィールド(フィールドがORされる順序など)に格納するにはどうすればよいでしょうか。

背景:昨夜、ゲームエンジンの一部を書いているときに、頭に浮かびました。色を記述しようとしているとしましょう。その一部として、記述子(およびその順序)に存在する色があります。たとえば、今日のほとんどのグラフィックカードには次のカラーオーダーがあります。

RGBA
BGRA

次のフラグを使用して、サポートされている色を説明できます。

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

ただし、これらのフィールドを使用するA | R | G | Bことは、と同じですB | 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)

リトルエンディアンシステムでは、各の前にShift( )だけ左にシフトします。左へのシフトは、次の理由で排除できます。元の例を考えると:<<ORNone0 << 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 に答える