3

ビットマスク列 (unsigned int) を持つテーブルがあります。このフィールドの値は、1、2、4、8、16 などです。

特定の値以外を選択するにはどうすればよいですか? IE 他のビットが何であるかは気にしません。特定のビットが 0 であることだけです。

私が試したこと:

mytable から count(*) を選択します。

これにより、3387255が得られます。

outageMask & ~8; の mytable から count(*) を選択します。

これにより、552061が得られます。

だから私はそれを仮定します:

outageMask & 8; mytable から count(*) を選択します。

私に2835194を与えるでしょう。そうではありません。代わりに87711を取得します。

私は何を間違っていますか?

4

1 に答える 1

5

特定のビットが 0 であることのみ。

これは重要。あなたが計算したものを見てみましょう(単純化のために8ビットの数値を使用):

 8 = 0b00001000
~8 = 0b11110111

では、これらのビットマスクを別の値でビットワイズ AND した場合、これらのビットマスクは何をテストするのでしょうか? 最初のマスクは、ビット「8」が設定されているかどうかをテストします。2 番目のマスクは、他のすべてのビットが設定されているかどうかをテストします。しかし、これはあなたが意図したものではなく、ステートメント全体を否定したかったのです。これは簡単です:

select count(*) from mytable where (outageMask & 8) = 0;
于 2013-01-28T17:25:21.343 に答える