私は現在自分のプロジェクトにあるコードを見ていましたが、次のようなものを見つけました:
public enum MyEnum
{
open = 1 << 00,
close = 1 << 01,
Maybe = 1 << 02,
........
}
オペランドは、第<<2 オペランドで指定されたビット数だけ第 1 オペランドを左にシフトするシフト オペランドです。
しかし、なぜ誰かがenum宣言でこれを使用するのでしょうか?
これにより、次のようなことができます。
var myEnumValue = MyEnum.open | MyEnum.close;
2 の倍数のビット値をカウントする必要はありません。
(このような):
public enum MyEnum
{
open = 1,
close = 2,
Maybe = 4,
........
}
これは通常、ビットフィールドで使用されます。パターンが何であるかが明確であり、正しい値を手動で計算する必要がなくなり、エラーの可能性が減少するためです。
[Flags]
public enum SomeBitField
{
open = 1 << 0 //1
closed = 1 << 1 //2
maybe = 1 << 2 //4
other = 1 << 3 //8
...
}
Flags列挙型の値を手で入力するのを避けるため。
public enum MyEnum
{
open = 0x01,
close = 0x02,
Maybe = 0x04,
........
}
これは、ビットを記述するためのよりクリーンで直感的な方法であることを目的としています。1、2、3 は、0x1、0x2、0x4 などよりも人間が読みやすいシーケンスです。
これは、組み合わせ可能な列挙型を作成することです。
それが効果的に意味することは次のとおりです。
public enum MyEnum
{
open = 1;
close = 2;
Maybe = 4;
//...
}
これは、[Flags]列挙型を作成するためのより確実な方法です。
これは 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);指定されたすべての列挙値で何かを行います。