有没有一种方法可以判断枚举是否仅设置了一个、多个或没有设置标志?

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)

das*_*ght 7

将值转换为 后,您可以通过简单的位技巧来确定这一点int

int v = (int)enumValue;

  1. 如果v == 0,则不设置任何标志
  2. 否则,如果((v-1)&v) == 0,则仅设置一个标志
  3. 否则,将设置多个标志。

唯一棘手的是#2。这里有一个解释:考虑一个恰好有一位设置为 的二进制数1。然后减去1会产生以下变化:

  0000010000000
-             1
  -------------
  0000001111111
Run Code Online (Sandbox Code Playgroud)

后面的所有零都1变成1s,1变成零,其余位保持不变。AND-ingv并产生零,因为两个数字之间v-1没有位于相同位置的 s 对。1

当有两个或多个1s 时,lone 左边的位1将保持不变。1因此,按位 的结果中至少有一个位置会有AND