我不太理解这个“bitmask”概念。
假设我有一个掩码:
var bitMask = 8 | 524288;
我知道这是如何将8
和524288
组合为524296
,但是,要怎么做相反的操作呢?如何检查是否包含 8
和/或 524288
?
让它变得更加复杂一些,假设我有一个位掩码为18358536
,我需要检查其中是否包含 8
和 524288
。我该如何做呢?
我不太理解这个“bitmask”概念。
假设我有一个掩码:
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)
}
你可能对枚举类型感兴趣,尤其是FlagsAttibute。
(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.
if ((mask & flag) == flag) { /* mask has flag set as true */ }
。
if ((mask & bitmask) != 0)
。我觉得这个更清晰一些(也许是因为多年来我打了太多次的!= null
)。 - Slipp D. ThompsonSELECT IF(128 & 1101 = 128, "YES", "NO");
。 - Barbz_YHOOL