我试图找出一个位掩码是否至少有一个与另一个位掩码中设置的位相同的位。我似乎找不到这样做的按位运算符,所以我提出了这个有效的代码,虽然我不能说我真的喜欢它。
[Flags]
enum TestFlags { a = 1, b = 2, c = 4, d = 8 }
static void Main(string[] args)
{
TestFlags
bm1 = TestFlags.a | TestFlags.d,
bm2 = TestFlags.b | TestFlags.c | TestFlags.d;
var SetFlags = Enum.GetValues(typeof(TestFlags))
.Cast<TestFlags>()
.Where(v => bm1.HasFlag(v));
foreach (var e in SetFlags.Where(f => bm2.HasFlag(f)))
{
Console.WriteLine(e.ToString());
}
}
有没有更优雅的方式来执行此检查?
答案 0 :(得分:1)
当然,只需使用bitwise-AND operator(&
):
var bm3 = bm1 & bm2; // TestFlags.d
这将返回一个新值,该值为bm1
和bm2
中设置的每个位设置了一个标志。
如果您想查看是否在此新值中设置了任何位,您只需将其与0
进行比较:
Console.WriteLine(bm3 != 0); // True
答案 1 :(得分:1)
使用和运算符并将结果与零进行比较,例如:
(bm1 & bm2) != 0
如果它是 true ,那么它们至少有1位共同点。