Найти все строки * без * флага (тип данных SET) - PullRequest
2 голосов
/ 28 октября 2011

Я пытался найти все "классы" без модификатора "interface", поэтому я написал:

SELECT * FROM classes WHERE modifiers & ~0x80

Где 0x80, очевидно, модификатор интерфейса.Это действительно отфильтровывало «интерфейсы», но также исключало классы без флагов.Поэтому мне пришлось изменить его на:

SELECT * FROM classes WHERE modifiers=0 OR modifiers & ~0x80

Это нормальный способ сделать это?Кажется смешным, что я должен сделать 2 проверки.Моя побитовая логика может быть немного ржавой.

Ответы [ 2 ]

1 голос
/ 28 октября 2011

Было бы лучше замаскировать (&) от ожидаемого значения, поэтому не имеет значения, какие другие значения (включая, если они равны нулю).Я предполагаю (вы не указываете), что interface modifier является восьмым битом.

Например:

SELECT * FROM classes WHERE modifiers &0x80=0x00;

Итак, здесь мы говорим, что 8-й бит нене устанавливайте, тогда мы хороши ... не имеет значения, какие еще биты (0 или 1). Примеры тестовых случаев:

SELECT 0x00 &0x80=0 FROM dual; //True
SELECT 0x7F &0x80=0 FROM dual; //True
SELECT 0x80 &0x80=0 FROM dual; //False
SELECT 0x8F &0x80=0 FROM dual; //False

(0x00, конечно, можно сократить до 0 ... простодля удобства чтения;))

1 голос
/ 28 октября 2011

Вы выбираете вещи, где любой из битов, кроме бита 8, равен 1. Просто проверьте, что бит явно равен 0: where (modifiers & 0x80) = 0

...