0

sqlite データベースのフラグを更新しようとしています。

フラグからビットを削除する必要があります。現在のフラグ値は 11 です。

Java では、次のように簡単に実行できます。

newflag = flag  ^ 2;
//newflag = 9

SQLで私は試します:

... SET flag = flag | ~2 ...

今度は db = -1 でフラグを立てます。なんで?

Firefox用のSQLite maganerでこれを試します。

SELECT 9 | 2

11 を返しますが、

SELECT 11 | ~2

-1 を返します

4

2 に答える 2

4

あなたの質問 (なぜ 11 | ~2 が -1 に評価されるのか) に答えるために、それを分割してみましょう。まず、ビットごとの補数:

> SELECT ~2;
-3

バイナリ表記を使用すると、これが起こっていることです。

 2 : 00000000000000000000000000000010
~2 : 11111111111111111111111111111101
-3 : 11111111111111111111111111111101

SQLite は 2 を取り、ビット単位の補数を適用して、符号付き整数として解釈します。SQLite では、~n (n は整数値) は数学的に -(n)-1 と同等です。これは、他のすべてのビットと共に符号ビットが反転するためです。これをよりよく理解するには、2 の補数を読んでください。

http://en.wikipedia.org/wiki/Two's_complement

次のビット単位または:

> SELECT 11 | ~2;
-1

再びバイナリで:

     11 : 00000000000000000000000000001011
     ~2 : 11111111111111111111111111111101
11 | ~2 : 11111111111111111111111111111111
     -1 : 11111111111111111111111111111111

Java のエミュレートに関しては、Java はビットごとの XOR 演算子 (^) を使用します。sqlite でビットごとの XOR をエミュレートするには、次の一般的な形式を使用できます。

(~(a&b))&(a|b)

http://www.mail-archive.com/sqlite-users@sqlite.org/msg02250.html

于 2013-05-08T14:14:40.513 に答える