39

私は現在自分のプロジェクトにあるコードを見ていましたが、次のようなものを見つけました:

public enum MyEnum
{
    open     = 1 << 00,
    close    = 1 << 01,
    Maybe    = 1 << 02,
    ........
}

オペランドは、第<<2 オペランドで指定されたビット数だけ第 1 オペランドを左にシフトするシフト オペランドです。

しかし、なぜ誰かがenum宣言でこれを使用するのでしょうか?

4

7 に答える 7

40

これにより、次のようなことができます。

var myEnumValue = MyEnum.open | MyEnum.close;

2 の倍数のビット値をカウントする必要はありません。

(このような):

public enum MyEnum
{
    open     = 1,
    close    = 2,
    Maybe    = 4,
    ........
}
于 2013-07-26T18:12:33.670 に答える
22

これは通常、ビットフィールドで使用されます。パターンが何であるかが明確であり、正しい値を手動で計算する必要がなくなり、エラーの可能性が減少するためです。

[Flags]
public enum SomeBitField
{
    open = 1 << 0    //1
    closed = 1 << 1  //2
    maybe = 1 << 2   //4
    other = 1 << 3   //8
    ...
}
于 2013-07-26T18:11:11.497 に答える
10

Flags列挙型の値を手で入力するのを避けるため。

public enum MyEnum
{
    open     = 0x01,
    close    = 0x02,
    Maybe    = 0x04,
    ........
}
于 2013-07-26T18:11:45.413 に答える
6

これは、ビットを記述するためのよりクリーンで直感的な方法であることを目的としています。1、2、3 は、0x1、0x2、0x4 などよりも人間が読みやすいシーケンスです。

于 2013-07-26T18:11:43.077 に答える
6

これは、組み合わせ可能な列挙型を作成することです。

それが効果的に意味することは次のとおりです。

public enum MyEnum
{
    open = 1;
    close = 2;
    Maybe = 4;
    //...
}

これは、[Flags]列挙型を作成するためのより確実な方法です。

于 2013-07-26T18:11:58.063 に答える
0

これは 2 のべき乗に等しいです。

public enum SomeEnum
{
    Enum1 = 1 << 0,    //1
    Enum2 = 1 << 1,    //2
    Enum3 = 1 << 2,    //4
    Enum4 = 1 << 3     //8
}

そして、そのような列挙型を使用すると、次のような関数が得られます。

void foo(unsigned ind flags)
{
    for (int = 0; i < MAX_NUMS; i++)
        if (1 << i & flags)
        {
            //do some stuff...
            //parameter to that stuff probably is i either enum value
        }
}

そして、その関数への呼び出しは、foo(Enum2 | Enum3);指定されたすべての列挙値で何かを行います。

于 2013-08-12T12:38:06.853 に答える