要回答您的问题(为什么 11 | ~2 评估为 -1),让我们分解一下。首先是按位补码:
> SELECT ~2;
-3
使用二进制表示法,这就是正在发生的事情:
2 : 00000000000000000000000000000010
~2 : 11111111111111111111111111111101
-3 : 11111111111111111111111111111101
SQLite 采用您的 2,应用按位补码,并将其解释为有符号整数。在 SQLite 中,~n(其中 n 是一个整数值)在数学上等价于 -(n)-1,因为它将符号位与所有其他位一起翻转。为了更好地理解这一点,请阅读二进制补码:
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 中模拟按位异或,您可以使用以下通用形式:
(~(a&b))&(a|b)
http://www.mail-archive.com/sqlite-users@sqlite.org/msg02250.html