Найти все строки * без * флага (УСТАНОВИТЬ тип данных)

#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.. просто для удобства чтения ;))