检查位掩码是否包含多个标志

时间:2016-12-08 10:46:15

标签: .net bitwise-operators

请注意,这不是这个问题的愚蠢:

Testing if a bitmask has one and only one flag

我需要验证位掩码是否包含多个标志。我已经提出了这种方法,但由于枚举和铸造,我不太喜欢它。

[Flags]
enum MyFlags { a = 1, b = 2, c = 4, d = 8 }

var flags = Enum.GetValues(typeof(MyFlags)).Cast<MyFlags>();

Console.WriteLine(flags.Any(f => f == (MyFlags.a | MyFlags.c))); //false
Console.WriteLine(flags.Any(f => f == MyFlags.b)); //true

1 个答案:

答案 0 :(得分:0)

如果你想要的是测试一个位掩码是否由标志组成,你可以这样做

MyFlags flag = MyFlags.b | MyFlags.d | MyFlags.a;

Console.WriteLine(flag.HasFlag(MyFlags.b));             // true
Console.WriteLine(flag.HasFlag(MyFlags.a | MyFlags.b)); // true
Console.WriteLine(flag.HasFlag(MyFlags.c | MyFlags.b)); // false

修改
您还可以查看BitArray班级 https://msdn.microsoft.com/en-us/library/system.collections.bitarray(v=vs.110).aspx

基本上你只需要计算BitArray

中设置为1的位数

您可以使用此快速GetCardinality方法对它们进行计数(或者,也可以使用for循环执行此操作):Counting bits set in a .Net BitArray Class。然后:

public static bool HasExactlyOneBitSet(Enum e)
{
    return GetCardinality(new BitArray(new[] { (int)(object)e })) == 1;
}

你会像这样使用它:

HasExactlyOneBitSet(MyFlags.A);             // true
HasExactlyOneBitSet(MyFlags.A | MyFlags.C); // false