C# 如何检查位掩码是否包含位?

C# 如何检查位掩码是否包含位?,c#,bit-manipulation,bitmask,C#,Bit Manipulation,Bitmask,我不太明白整个比特掩码的概念 假设我有一个面具: var bitMask = 8 | 524288; 我不知道这就是我将如何组合8和524288,得到524296 但是,我该怎么走另一条路呢?如何检查我的位掩码,以查看它是否包含8和/或524288 让它更复杂一点,假设我的位掩码是18358536,我需要检查8和524288是否在该位掩码中。我到底该怎么做呢?好吧 if (8 & bitmask == 8 ) { } 将检查位掩码是否包含8 更复杂 int mask = 8 | 12

我不太明白整个比特掩码的概念

假设我有一个面具:

var bitMask = 8 | 524288;
我不知道这就是我将如何组合
8
524288
,得到
524296

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

让它更复杂一点,假设我的位掩码是
18358536
,我需要检查
8
524288
是否在该位掩码中。我到底该怎么做呢?

好吧

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可能会感兴趣,尤其是。

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

例如:

if((18358536 & 8) == 8) 
{
    // mask contains 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位标记为true。因此,我们可以使用内存中为整数保留的相同空间来保存定义一些布尔属性的多个标志

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

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

如果((掩码和位掩码)!=0),您也可以读取

。如果发现这一点更清楚一点(可能是因为多年来我多次键入
!=null
)。在查找SQL问题时发现了这一点,这很有帮助,因此在这里我将等效项放在SQL
SELECT If(128&1101=128,“YES”,“NO”)