2013-05-08 39 views
0

我尝试更新sqlite数据库中的标志。sqlite按位异或 - 按位不工作,因为我期望

我需要从我的国旗删除位。当前标志vallue是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

要回答你的问题(为什么11 |〜2评估为-1),让我们来打破它。首先,按位补:

> SELECT ~2; 
-3 

使用二进制表示法,这是发生了什么事:

2 : 00000000000000000000000000000010 
~2 : 11111111111111111111111111111101 
-3 : 11111111111111111111111111111101 

SQLite的需要你的2,按位对补充,并解释为一个有符号整数。在SQLite中,〜n(其中n是一个整数值)在数学上等价于 - (n)-1,因为它翻转符号位以及所有其他位。同样是在二进制

> SELECT 11 | ~2; 
-1 

:为了更好地理解,在两个补读了起来:

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

下一页按位或

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

至于模仿你的Java:您的Java使用按位异或运算符(^)。为了模拟按位异或SQLite中,你可以使用这个一般形式:

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

http://www.mail-archive.com/[email protected]/msg02250.html

+0

我用标志=标志&〜2和它的作品! – Nik 2013-05-23 04:57:17