2

オプションのセット、いくつかの直交 (任意の組み合わせで組み合わせることができます)、いくつかの排他的 (セットから 1 つだけが許可されます) があり、ビットごとに組み合わせて抽出enumできるように一連の値を選択する必要があります。orビット単位でandor-ing無効な組み合わせが検出可能になることをお勧めします。

このような生成ツールはありますenumsか?

明確にするために編集する

一部のフラグの組み合わせが無効であるという事実を利用して、使用されるビット数を減らすことができるものを探しています。エラーを検出できるという要件は緩いです。物がぐちゃぐちゃになった場合、何が使用されたかを知る必要はありません。

私は C# を使用していますが、どのソリューションも役立つはずです。

パターンの例は次のとおりです。

0011 00
0101 00
1001 00
0110 00
1010 00
1100 00

0000 01
0000 10

6つの排他的フラグと2の直交ペアを6ビットに取得します

簡単なテストでは、5 ビットで 9 つの値が得られ、6 ビットで 20 の値が得られることが示されています...

4

7 に答える 7

5

これを行うための私が知っている最善の一般的な方法は、ツールではなく、慣例です。ビットフラグのリストを次のように定義します。

FLAG_1                    0x00000001
FLAG_2                    0x00000002
FLAG_3                    0x00000004
FLAG_4                    0x00000008
FLAG_5                    0x00000010
FLAG_6                    0x00000020

左に1、2、4、8のパターンで数字が続くので扱いやすいです。

編集: コメントに応答します。ビットフラグと排他的な列挙の組み合わせが本当に必要な場合は、基本的に、ビット リストの一部をセグメント化して、数値スペースとして扱う必要があります。したがって、0x1 と 0x2 の 2 つのビットを使用して、これらの 2 つのビットを使用して 0 ~ 3 を表すことができます。何かのようなもの:

OPT_1_VAL_1               0x00000000
OPT_1_VAL_2               0x00000001
OPT_1_VAL_3               0x00000002
OPT_1_VAL_4               0x00000003
FLAG_1                    0x00000004
FLAG_2                    0x00000008
FLAG_3                    0x00000010
FLAG_4                    0x00000020

使用するマスキング ロジックは、より複雑にする必要があります。フラグを検索するには、if(settings & FLAG_1) を実行できますが、オプション スペースについては、if((settings & OPT_1_VAL_3) == OPT_1_VAL_3) を実行する必要があります。

于 2009-02-04T22:40:15.450 に答える
3

ツールについては知りませんが、一意のビットの列挙型をわずかに簡単に作成するためのトリックを次に示します。

public enum Critters
{
   Amorphous = 0,
   Sloth =     1 << 0,
   Armadillo = 1 << 1,
   Weasel =    1 << 2,
   Crab =      1 << 3,
   Partridge = 1 << 4,
   Parakeet =  1 << 5,
   Rhino =     1 << 6
};
于 2009-02-04T23:04:19.693 に答える
2

各フラグが 1 つのビット位置に対応するように、2 の累乗を使用します。

于 2009-02-04T22:44:10.917 に答える