如果位掩码包含位,我该如何检查?

时间:2013-01-23 12:40:09

标签: c# bit-manipulation bitmask

我不太了解整个bitmask概念。

假设我有一个面具:

var bitMask = 8 | 524288;

我认为这就是我将8524288结合起来并获得524296的方式。

但是,我该如何走另一条路?如何检查我的位掩码,看它是否包含8和/或524288

为了使它更复杂,让我们说我的位掩码是18358536,我需要检查{bit}中是否有8524288。我到底该怎么做?

3 个答案:

答案 0 :(得分:31)

以及

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)
}

可能会对enum感兴趣,尤其是FlagsAttibute

答案 1 :(得分:6)

我非常确定(A & B)==B其中A是位掩码,B是您要检查的内容。

示例:

if((18358536 & 8) == 8) 
{
    // mask contains 8
}

答案 2 :(得分:3)

首先,位掩码用于操作位,而不是整数。当我们处理的只是1和0而不是更复杂的数字时,要容易理解。

例如:

1000110000010000100100000 = 18358536(二进制)。

0000010000000000000000000 = 524288二进制。

0000000000000000000001000 = 8二进制。

0000010000000000000001000 = 524296二进制。

有了这个,很明显整数8是从右侧开始的第4位而没有标记其他位,因此当我们将8添加到524288(仅第20位)时,我们只是将第4位和第20位标记为真。因此,我们可以在为整数保留的内存中使用相同的空间来保存定义一些布尔属性的多个标志。

正如Alex已经解释的那样,您可以使用按位AND运算符检查位掩码中是否有可用的标志:

if(mask& flag)== flag){// mask将flag设置为true}

您可以阅读everything about bitmasks in this article