Nic*_*lai 17 c# bit-manipulation bitmask
我不太了解整个bitmask概念.
假设我有一个面具:
var bitMask = 8 | 524288;
Run Code Online (Sandbox Code Playgroud)
我已了解,这是我怎么会结合起来8,并524288和获得524296.
但是,我该如何走另一条路呢?如何检查我的位掩码,看它是否包含8和/或524288?
为了使它更复杂,让我们说我的位掩码是18358536,我需要检查是否8和524288在该位掩码.我到底怎么做?
tsc*_*007 32
好
if (8 & bitmask == 8 ) {
}
Run Code Online (Sandbox Code Playgroud)
将检查位掩码是否包含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)
}
Run Code Online (Sandbox Code Playgroud)
可能会对枚举感兴趣,尤其是FlagsAttibute.
首先,位掩码用于操作位,而不是整数。当我们只处理 1 和 0 时,比处理更复杂的数字更容易理解。
例如:
1000110000010000100001000 = 18358536 // in binary.
0000010000000000000000000 = 524288 // in binary.
0000000000000000000001000 = 8 // in binary.
0000010000000000000001000 = 524296 // in binary.
Run Code Online (Sandbox Code Playgroud)
有了这个,很明显整数 8 是从右侧开始的第 4 位并且没有标记其他位,因此当我们将 8 添加到 524288(仅第 20 位)时,我们只是将第 4 位和第 20 位标记为真。因此,我们可以使用为整数保留的相同内存空间来保存定义一些布尔属性的多个标志。
正如亚历克斯已经解释的那样,您可以使用按位 AND 运算符检查位掩码中是否有任何标志可用:
if ((mask & flag) == flag) { /* mask has flag set as true */ }
Run Code Online (Sandbox Code Playgroud)
您可以在本文中阅读有关位掩码的所有内容
我很确定位掩码(A & B)==B在哪里A,B你想要检查的是什么.
例:
if((18358536 & 8) == 8)
{
// mask contains 8
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
25823 次 |
| 最近记录: |