我尝试更新sqlite数据库中的flag。
我需要从我的旗子上去掉一点。当前标志值为11。
在Java中,我简单地做了:
newflag = flag ^ 2;
//newflag = 9在SQL中,我尝试:
... SET flag = flag | ~2 ...现在,db中的flag = -1。为什么?
我在火狐的SQLite maganer中尝试了一下。
SELECT 9 | 2返回11,但是
SELECT 11 | ~2返回-1
发布于 2013-05-08 22:14:41
为了回答您的问题(为什么11 | ~2的计算结果为-1),让我们将其分解。首先是按位补码:
> SELECT ~2;
-3使用二进制表示法,这是正在发生的事情:
2 : 00000000000000000000000000000010
~2 : 11111111111111111111111111111101
-3 : 11111111111111111111111111111101SQLite获取2,应用按位补码,并将其解释为有符号整数。在SQLite中,~n (其中n是整数值)在数学上等同于-(n)-1,因为它将符号位与所有其他位一起翻转。为了更好地理解这一点,请阅读Two's补语:
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
发布于 2020-01-29 01:55:12
在bsa非常全面的答案上加上标签,关闭整数中的一位,并使用OP的示例,您可以简单地:
SELECT 11 & ~2; -- result is 9因此,"~2“将除"2”位之外的所有位都设置为on,并对标志执行逐位and运算,强制关闭2位。
顺便说一句,如果你确定某个特定的位是打开的,你可以简单地通过减法将其关闭。
例如,SELECT 11 - 2;--结果为9
相反,如果某个位处于关闭状态,则可以通过添加将其打开。
https://stackoverflow.com/questions/16440831
复制相似问题