枚举中两个变量中的标志数

时间:2017-10-13 14:06:53

标签: c# enums

我有以下枚举:

[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

我尝试了按位操作,但我认为我不能从中得到这个值。

2 个答案:

答案 0 :(得分:3)

您可以将标志组合在一起然后计算设置位数(这称为整数的"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

答案 1 :(得分:2)

另一个可能的答案是通过BitArray类

when ($_ eq "line to be overwritten")
when ($_ == "line to be overwritten")
when ($_ cmp "line to be overwritten")