如何检查两个位掩码之间是否有任何公共位?

时间:2014-08-01 18:39:00

标签: .net bit-manipulation bitwise-operators

我试图找出一个位掩码是否至少有一个与另一个位掩码中设置的位相同的位。我似乎找不到这样做的按位运算符,所以我提出了这个有效的代码,虽然我不能说我真的喜欢它。

[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());
    }
}

有没有更优雅的方式来执行此检查?

2 个答案:

答案 0 :(得分:1)

当然,只需使用bitwise-AND operator&):

var bm3 = bm1 & bm2; // TestFlags.d

这将返回一个新值,该值为bm1bm2中设置的每个位设置了一个标志。

如果您想查看是否在此新值中设置了任何位,您只需将其与0进行比较:

Console.WriteLine(bm3 != 0); // True

答案 1 :(得分:1)

使用运算符并将结果与​​零进行比较,例如:

(bm1 & bm2) != 0

如果它是 true ,那么它们至少有1位共同点。