查找所有行*,不带*标志(SET数据类型)

时间:2011-10-28 16:48:49

标签: mysql logic bit-manipulation

我试图找到没有“interface”修饰符的所有“类”,所以我写道:

SELECT * FROM classes WHERE modifiers & ~0x80

0x80显然是界面修饰符。这确实过滤掉了“接口”,但它也排除了没有标志的类。所以我不得不将其修改为:

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

这是正常的做法吗?似乎很有趣,我必须做2次检查。我的按位逻辑可能有点生锈。

2 个答案:

答案 0 :(得分:1)

您正在选择除第8位以外的任何位为1的内容。只需明确测试该位为0:where (modifiers & 0x80) = 0

答案 1 :(得分:1)

最好屏蔽(&)关闭你期望的值,这样其他值无关紧要(包括它们是否为零)。我假设(你没有指定)interface modifier是第8位。

例如:

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 ..只是为了便于阅读;))