Как проверить, содержит ли 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 }
вы можете узнать все о битовых масок в этой статье