像整数一样使用标志枚举空间

时间:2018-11-04 07:30:00

标签: c# c#-4.0 enums bitwise-operators

我可以使用枚举标志之间的空格来存储整数吗?我刚刚尝试过:

[Flags]
public enum Occupation : int
{
    Open=16,
    Flagged = 32,
    Bomb = 64 
}

我希望这会导致这样的枚举:

0b0 ... 0
0b1 ... 1
0b10 ... 2
.
.
0b1111 ... 15
0b10000 ... Open
0b10001 ... Open + 1
0b10010 ... Open + 2
.
.
0b011111 ... Open + 15
0b100000 ... Flagged
0b100001 ... Flagged + 1
.
0b101111 ... Flagged + 15
0b110000 ... Flagged, Open
0b110001 ... Flagged, Open + 1

,依此类推。我希望,枚举将忽略标志之间的值,但是如果我像这样对枚举进行位与运算,似乎它们都被设置为0(或无)。

Occupation occ = Occupation.Open; //initialize the enum with a Flag
occ += 8; //add 8 to the first bits of the enum without touching the Flags
Console.WriteLine((occ & (Occupation) 8 ).ToString());
//Expected Output: 8
//Actual Output: 0

根据this documentation,应该有可能在其中“存储一些值”(至少从整数转换时)。我是否真的必须从任何地方都将其强制转换为整数,或者有更好的方法来实现这一点?

1 个答案:

答案 0 :(得分:0)

正如评论中的dlatikay一样,确实有可能在枚举中的Flags前面存储一个整数。我只是使用错误的整数来提取数字。由于这些标志始终是2的幂,因此提取的数字必须比第一个标志小。在此示例中,第一个Flag是16。因此,您可以在该枚举中存储最多15个数字,也可以使用15进行提取。

示例:

[Flags]
public enum MyEnum
{
    FlagA = 16,          //0b010000
    FlagB = 32,          //0b100000
}

.
.

MyEnum e = MyEnum.FlagA; //0b010000
e += 6;                  //0b010000 + 0b000110 EQUALS 0b010110
int x = (int)e & 15      //15=0b001111 AND e=0b010110 EQUALS 0b000110
Console.Write(x);        //6
Console.WriteLine(e.HasFlag(MyEnum.A)); //true