21

我不太了解整个位掩码概念。

假设我有一个面具:

var bitMask = 8 | 524288;

我不明白这就是我将如何结合8and524288和 get 524296

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

为了让它更复杂一点,假设我拥有的位掩码是18358536,我需要检查是否8并且524288在那个位掩码中。我到底该怎么做?

4

3 回答 3

43

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

于 2013-01-23T12:43:50.823 回答
9

我很确定位掩码(A & B)==B在哪里,并且是您想要检查的任何内容。AB

例子:

if((18358536 & 8) == 8) 
{
    // mask contains 8
}
于 2013-01-23T12:44:53.633 回答
7

首先,位掩码用于操作位,而不是整数。当我们只处理 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 已经解释的那样,您可以使用按位 AND 运算符检查位掩码中是否有任何标志可用:

if ((mask & flag) == flag) { /* mask has flag set as true */ }

您可以在本文中阅读有关位掩码的所有内容

于 2018-05-31T07:45:24.683 回答