首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sqlite中的按位XOR -按位不能像我预期的那样工作

sqlite中的按位XOR -按位不能像我预期的那样工作
EN

Stack Overflow用户
提问于 2013-05-08 20:35:19
回答 2查看 3.4K关注 0票数 0

我尝试更新sqlite数据库中的flag。

我需要从我的旗子上去掉一点。当前标志值为11。

在Java中,我简单地做了:

代码语言:javascript
复制
newflag = flag  ^ 2;
//newflag = 9

在SQL中,我尝试:

代码语言:javascript
复制
... SET flag = flag | ~2 ...

现在,db中的flag = -1。为什么?

我在火狐的SQLite maganer中尝试了一下。

代码语言:javascript
复制
SELECT 9 | 2

返回11,但是

代码语言:javascript
复制
SELECT 11 | ~2

返回-1

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-08 22:14:41

为了回答您的问题(为什么11 | ~2的计算结果为-1),让我们将其分解。首先是按位补码:

代码语言:javascript
复制
> SELECT ~2;
-3

使用二进制表示法,这是正在发生的事情:

代码语言:javascript
复制
 2 : 00000000000000000000000000000010
~2 : 11111111111111111111111111111101
-3 : 11111111111111111111111111111101

SQLite获取2,应用按位补码,并将其解释为有符号整数。在SQLite中,~n (其中n是整数值)在数学上等同于-(n)-1,因为它将符号位与所有其他位一起翻转。为了更好地理解这一点,请阅读Two's补语:

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

下一步是按位或:

代码语言:javascript
复制
> SELECT 11 | ~2;
-1

同样用二进制表示:

代码语言:javascript
复制
     11 : 00000000000000000000000000001011
     ~2 : 11111111111111111111111111111101
11 | ~2 : 11111111111111111111111111111111
     -1 : 11111111111111111111111111111111

至于模拟Java: Java使用的是按位XOR运算符(^)。要在sqlite中模拟按位XOR,您可以使用以下一般形式:

代码语言:javascript
复制
(~(a&b))&(a|b)

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

票数 4
EN

Stack Overflow用户

发布于 2020-01-29 01:55:12

在bsa非常全面的答案上加上标签,关闭整数中的一位,并使用OP的示例,您可以简单地:

代码语言:javascript
复制
SELECT 11 & ~2;  -- result is 9

因此,"~2“将除"2”位之外的所有位都设置为on,并对标志执行逐位and运算,强制关闭2位。

顺便说一句,如果你确定某个特定的位是打开的,你可以简单地通过减法将其关闭。

例如,SELECT 11 - 2;--结果为9

相反,如果某个位处于关闭状态,则可以通过添加将其打开。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16440831

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档