如何检查位掩码中是否包含某一位?

25

我不太理解这个“bitmask”概念。

假设我有一个掩码:

var bitMask = 8 | 524288;

我知道这是如何将8524288组合为524296,但是,要怎么做相反的操作呢?如何检查是否包含 8 和/或 524288?

让它变得更加复杂一些,假设我有一个位掩码为18358536,我需要检查其中是否包含 8524288。我该如何做呢?

3个回答

48

好的

if (8 & bitmask == 8 ) {
}

将检查位掩码是否包含 8。

更加复杂

int mask = 8 | 12345;
if (mask & bitmask == mask) {
   //true if, and only if, bitmask contains 8 | 12345
}

if (mask & bitmask != 0) {
   //true if bitmask contains 8 or 12345 or (8 | 12345)
}

你可能对枚举类型感兴趣,尤其是FlagsAttibute


2
或者,if ((mask & bitmask) != 0)。我觉得这个更清晰一些(也许是因为多年来我打了太多次的 != null)。 - Slipp D. Thompson
在寻找 SQL 问题时,我发现了这个,它对我很有帮助,所以我在这里将其等效于 SQL SELECT IF(128 & 1101 = 128, "YES", "NO"); - Barbz_YHOOL

10
我很确定 (A & B)==B,其中A是位掩码,B是您想要检查的任何内容。
示例:
if((18358536 & 8) == 8) 
{
    // mask contains 8
}

8

首先,位掩码是用于操作位而非整数的。当我们只涉及到1和0这样简单的数字时,理解起来会更加容易。

例如:

1000110000010000100001000 = 18358536 // in binary.

0000010000000000000000000 = 524288   // in binary.

0000000000000000000001000 = 8        // in binary.

0000010000000000000001000 = 524296   // in binary.

通过这个例子,我们可以清楚地看到整数8是从右边数的第4位且没有标记其他的位。因此,当我们将8添加到524288(只有第20位)时,我们只是将第4位和第20位标记为真。因此,我们可以使用为整数保留的同一内存空间来存储多个标志,以定义某些布尔属性。
正如Alex已经解释过的那样,您可以使用按位与运算符检查位掩码中是否存在任何标志。
if ((mask & flag) == flag) { /* mask has flag set as true */ }

你可以在这篇文章中阅读关于位掩码的所有内容


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接