131

多くの場合、16進値を使用するフラグ列挙型宣言を目にします。例えば:

[Flags]
public enum MyEnum
{
    None  = 0x0,
    Flag1 = 0x1,
    Flag2 = 0x2,
    Flag3 = 0x4,
    Flag4 = 0x8,
    Flag5 = 0x10
}

列挙型を宣言するときは、通常、次のように宣言します。

[Flags]
public enum MyEnum
{
    None  = 0,
    Flag1 = 1,
    Flag2 = 2,
    Flag3 = 4,
    Flag4 = 8,
    Flag5 = 16
}

一部の人々が値を10進数ではなく16進数で書き込むことを選択する理由または理論的根拠はありますか?私の見方では、16進値を使用すると混乱しやすく、のFlag5 = 0x16代わりに誤って書き込むことがありFlag5 = 0x10ます。

4

6 に答える 6

195

理論的根拠は異なる場合がありますが、16進数で次のように思い出されるという利点があります。「人間が発明した任意の10進数の世界では、数値を処理していません。ビット(マシンの世界)を処理しています。そのルールに従ってプレーするつもりです。」データのメモリレイアウトが重要な比較的低レベルのトピックを扱っている場合を除いて、16進数が使用されることはめったにありません。それを使用することは、それが私たちが今いる状況であるという事実を示唆しています。

また、C#についてはよくわかりませんが、Cx << yでは有効なコンパイル時定数であることはわかっています。ビットシフトの使用が最も明確なようです。

[Flags]
public enum MyEnum
{
    None  = 0,
    Flag1 = 1 << 0,  //1
    Flag2 = 1 << 1,  //2
    Flag3 = 1 << 2,  //4
    Flag4 = 1 << 3,  //8
    Flag5 = 1 << 4   //16
}
于 2012-11-04T20:47:40.393 に答える
47

これらがバイナリフラグであることを簡単に確認できます。

None  = 0x0,  // == 00000
Flag1 = 0x1,  // == 00001
Flag2 = 0x2,  // == 00010
Flag3 = 0x4,  // == 00100
Flag4 = 0x8,  // == 01000
Flag5 = 0x10  // == 10000

進行はそれをさらに明確にしますが:

Flag6 = 0x20  // == 00100000
Flag7 = 0x40  // == 01000000
Flag8 = 0x80  // == 10000000
于 2012-11-04T20:42:03.403 に答える
44

シーケンスが常に1,2,4,8であり、次に0を追加するからだと思います
。ご覧のとおり:

0x1 = 1 
0x2 = 2
0x4 = 4
0x8 = 8
0x10 = 16
0x20 = 32
0x40 = 64
0x80 = 128
0x100 = 256
0x200 = 512
0x400 = 1024
0x800 = 2048

など、シーケンス1-2-4-8を覚えている限り、2の累乗を覚えていなくても、後続のすべてのフラグを作成できます。

于 2014-08-05T14:02:47.620 に答える
16

[Flags]これは、列挙型が実際にはビットフィールドであることを意味します。を[Flags]使用すると、ビット単位のAND(&)およびOR(|)演算子を使用してフラグを組み合わせることができます。このような2進値を扱う場合、ほとんどの場合、16進値を使用する方が明確です。これが、そもそも16進数を使用する理由です。各16進文字は、正確に1つのニブル(4ビット)に対応します。10進数の場合、この1から4へのマッピングは当てはまりません。

于 2012-11-04T20:42:34.630 に答える
5

なぜなら、16進数で2の累乗を2倍にする機械的で簡単な方法があるからです。10進数では、これは難しいです。それはあなたの頭の中で長い掛け算を必要とします。16進数では、これは単純な変更です。1UL << 63これは、10進数では実行できないまで実行できます。

于 2012-11-08T21:04:39.373 に答える
4

なぜなら、ビットが旗の中にある人間にとっては追跡しやすいからです。各16進数は、4ビットの2進数に適合できます。

0x0 = 0000
0x1 = 0001
0x2 = 0010
0x3 = 0011

... and so on

0xF = 1111

通常、フラグがビットと重ならないようにする必要があります。これを実行および視覚化する最も簡単な方法は、16進値を使用してフラグを宣言することです。

したがって、16ビットのフラグが必要な場合は、4桁の16進値を使用します。これにより、誤った値を回避できます。

0x0001 //= 1 = 000000000000 0001
0x0002 //= 2 = 000000000000 0010
0x0004 //= 4 = 000000000000 0100
0x0008 //= 8 = 000000000000 1000
...
0x0010 //= 16 = 0000 0000 0001 0000
0x0020 //= 32 = 0000 0000 0010 0000
...
0x8000 //= 32768 = 1000 0000 0000 0000
于 2013-10-08T19:05:12.110 に答える