【问题标题】:Find all rows *without* a flag (SET data type)查找*没有*标志的所有行(SET 数据类型)
【发布时间】:2011-10-28 16:48:48
【问题描述】:

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

SELECT * FROM classes WHERE modifiers & ~0x80

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

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

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

【问题讨论】:

    标签: mysql logic bit-manipulation


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      最好将您期望的值屏蔽 (&),这样其他值是什么(包括它们是否为零)都无关紧要。我假设(你没有指定)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.. 只是为了可读性;))

      【讨论】:

        猜你喜欢
        • 2018-03-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-31
        相关资源
        最近更新 更多