Как проверить, содержит ли bitmask бит?

Я не совсем понимаю всю эту концепцию маски.

допустим, у меня есть маска:

var bitMask = 8 | 524288;

Я undestand, что это, как я бы объединить 8 и 524288, и сделать 524296.

но как мне пойти другим путем? Как проверить мою битовую маску, чтобы увидеть, содержит ли она 8 и/или 524288?

чтобы сделать его немного сложнее, скажем, битовая маска у меня есть 18358536 и мне нужно проверить, если 8 и 524288 в этом битовая маска. Как же мне это сделать?

3 ответов


хорошо

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 в двоичном формате.

00000100000000000000000000000 = 524288 в двоичном формате.

0000000000000000000001000 = 8 в двоичном формате.

0000010000000000000001000 = 524296 в двоичном формате.

с этим ясно, что целое число 8-это 4-й бит с правой стороны, и никакие другие биты не отмечены, поэтому, когда мы добавляем 8 к 524288 (только 20-й бит), мы просто отмечаем 4-й и 20-й биты как истинные. Таким образом, мы можем использовать одно и то же пространство в памяти, зарезервированное для целого числа, для хранения нескольких флагов, определяющих некоторые логические свойства.

Как уже объяснил Алекс, вы можете проверить, доступен ли какой-либо флаг в bitmask с помощью побитового оператора AND:

if (mask & flag) == flag) {//mask имеет флаг, установленный как true }

вы можете узнать все о битовых масок в этой статье