Подтвердить что ты не робот

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

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

Скажем, у меня есть маска:

var bitMask = 8 | 524288;

Я понял, что так я объединим 8 и 524288, и получим 524296.

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

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

4b9b3361

Ответ 1

а

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.

Ответ 2

Я уверен, (A & B)==B, где A - это битмаска, а B - это то, что вы хотите проверить.

Пример:

if((18358536 & 8) == 8) 
{
    // mask contains 8
}

Ответ 3

Прежде всего, битовые маски предназначены для работы с битами, а не с целыми числами. Намного легче понять, когда мы имеем дело только с 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-й биты как истинные. Таким образом, мы можем использовать одно и то же пространство в памяти, зарезервированное для целого числа, для хранения нескольких флагов, которые определяют некоторые логические свойства.

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

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

Вы можете прочитать все о битовых масках в этой статье.