我有以下枚举:

[Flags]
public enum Letter
{
    NONE  = 0,
    A = 1,
    B = 2,
    C = 4,
    A_B = A | B,
    A_C = A | C,
    B_C = B | C,
    ALL = A | B | C
}


我有以下代码:

Letter first = Letter.A_B;
Letter second = Letter.B_C;


如何获取first变量中以及second变量中的标志数?

我想要的结果是:

Letter first = Letter.A_B;
Letter second = Letter.B_C;
int numberOfSameFlags = ...; // should return 1 in this example

Letter first = Letter.A_B;
Letter second = Letter.ALL;
int numberOfSameFlags = ...; // should return 2 in this example


我尝试了按位运算,但我认为无法从中获得此值。

最佳答案

您可以将这些标志与在一起,然后计算设置的位数(称为整数的"Hamming Weight")。

一种计数设置位的方法(有很多,这是我从网上抢来的一种):

public static int HammingWeight(int i)
{
     i = i - ((i >> 1) & 0x55555555);
     i = (i & 0x33333333) + ((i >> 2) & 0x33333333);
     return (((i + (i >> 4)) & 0x0F0F0F0F) * 0x01010101) >> 24;
}


因此,对于您的问题:

Letter first = Letter.A_B;
Letter second = Letter.B_C;
Console.WriteLine(HammingWeight((int)first & (int)second));


和:

Letter first = Letter.A_B;
Letter second = Letter.ALL;
Console.WriteLine(HammingWeight((int)first & (int)second));


如果您想知道特定实现的工作方式,请see here

关于c# - 枚举中两个变量中的标志数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46731789/

10-12 00:29