Как проверить, если битмаска содержит бит?
Я не совсем понимаю эту концепцию битовой маски.
Скажем, у меня есть маска:
var bitMask = 8 | 524288;
Я понял, что так я объединим 8
и 524288
, и получим 524296
.
НО, как мне пойти другим путем? Как проверить свою битовую маску, чтобы увидеть, содержит ли она 8
и/или 524288
?
Чтобы сделать его немного сложнее, скажем, у битовой маски, которая у меня есть, есть 18358536
, и мне нужно проверить, находятся ли в этой битовой маске 8
и 524288
. Как бы я это сделал?
Ответы
Ответ 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 */ }
Вы можете прочитать все о битовых масках в этой статье.