mysql / bitmask: выберите значение НЕ

У меня есть таблица с битовой маской столбца (без знака int). Это поле имеет значения 1, 2, 4, 8, 16 и т. Д.

Как выбрать для НЕ определенного значения? То есть мне все равно, что за другие биты - только то, что конкретный бит равен 0.

Что я пробовал:

выберите количество (*) из mytable;

Это дает мне 3387255.

выберите количество (*) в mytable, где outageMask & ~8;

Это дает мне 552061.

Так что я бы предположил, что:

выберите количество (*) в mytable, где outageMask & 8;

дал бы мне 2835194. Не так. Вместо этого я получаю 87711.

Что я делаю неправильно?

1 ответ

Решение

только то, что конкретный бит будет 0.

Это важно. Посмотрим, что вы рассчитали (с 8-битными числами для упрощения):

 8 = 0b00001000
~8 = 0b11110111

Итак, что тестируют эти битовые маски, если вы BITWISE И их с другим значением? Первая маска проверяет, установлен ли бит "8". Вторая маска проверяет, установлены ли все остальные биты. Но это не то, что вы хотели, вы хотели отрицания всего утверждения. Что легко:

select count(*) from mytable where (outageMask & 8) = 0;
Другие вопросы по тегам