我试图找到没有“interface”修饰符的所有“类”,所以我写道:
SELECT * FROM classes WHERE modifiers & ~0x80
0x80
显然是界面修饰符。这确实过滤掉了“接口”,但它也排除了没有标志的类。所以我不得不将其修改为:
SELECT * FROM classes WHERE modifiers=0 OR modifiers & ~0x80
这是正常的做法吗?似乎很有趣,我必须做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 ..只是为了便于阅读;))