あなたの質問 (なぜ 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