Nor*_*man 4 c# enums enum-flags
我有一个这样定义的枚举:
[Flags]
public enum Orientation
{
North = 1,
North_East = 2,
East = 4,
South_East = 8,
South = 16,
South_West = 32,
West = 64,
North_West = 128
}
Run Code Online (Sandbox Code Playgroud)
是否有一种通用方法可以判断是否设置了一个标志、多个标志还是没有设置?我不关心枚举的值是什么,我只想知道设置了多少个标志。
这不是用于计算位数的重复。如果我像这样初始化枚举并计算位数,我会得到 10。但是设置标志的数量将为 8。
GeographicOrientation go = (GeographicOrientation) 1023;
Run Code Online (Sandbox Code Playgroud)
将值转换为 后,您可以通过简单的位技巧来确定这一点int
:
int v = (int)enumValue;
v == 0
,则不设置任何标志((v-1)&v) == 0
,则仅设置一个标志唯一棘手的是#2。这里有一个解释:考虑一个恰好有一位设置为 的二进制数1
。然后减去1
会产生以下变化:
0000010000000
- 1
-------------
0000001111111
Run Code Online (Sandbox Code Playgroud)
后面的所有零都1
变成1
s,1
变成零,其余位保持不变。AND
-ingv
并产生零,因为两个数字之间v-1
没有位于相同位置的 s 对。1
当有两个或多个1
s 时,lone 左边的位1
将保持不变。1
因此,按位 的结果中至少有一个位置会有AND
。