繁体   English   中英

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

[英]Use Flags Enum space like an integer

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

[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

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

正如评论中提到的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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM