#mysql #logic #bit-manipulation
#mysql #Логические #битовая манипуляция
Вопрос:
Я пытался найти все все «классы» без модификатора «интерфейс», поэтому я написал:
SELECT * FROM classes WHERE modifiers amp; ~0x80
Где 0x80
, очевидно, модификатор интерфейса. Это действительно отфильтровывало «интерфейсы», но также исключало классы без флагов. Поэтому мне пришлось изменить его на:
SELECT * FROM classes WHERE modifiers=0 OR modifiers amp; ~0x80
Это обычный способ сделать это? Кажется забавным, что мне нужно выполнить 2 проверки. Моя побитовая логика может быть немного ржавой.
Ответ №1:
Вы выбираете материал, в котором любой из битов, кроме бита 8, равен 1. Просто проверьте, что бит явно равен 0: where (modifiers amp; 0x80) = 0
Ответ №2:
Было бы лучше замаскировать (amp;) от ожидаемого значения, чтобы тогда не имело значения, каковы другие значения (в том числе, если они равны нулю). Я предполагаю (вы не указываете), что interface modifier
это восьмой бит.
Например:
SELECT * FROM classes WHERE modifiers amp;0x80=0x00;
Итак, здесь мы говорим, что если 8-й бит не установлен, то все в порядке … не имеет значения, какие другие биты (0 или 1) Примеры тестовых примеров:
SELECT 0x00 amp;0x80=0 FROM dual; //True
SELECT 0x7F amp;0x80=0 FROM dual; //True
SELECT 0x80 amp;0x80=0 FROM dual; //False
SELECT 0x8F amp;0x80=0 FROM dual; //False
(0x00, конечно, можно сократить до 0.. просто для удобства чтения ;))