请注意,这不是这个问题的愚蠢:
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
答案 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
您可以使用此快速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