使用否定在Java中进行位操作

时间:2015-12-25 19:31:47

标签: java bit-manipulation

我正在尝试进行位操作,有人可以提供可以帮助我解决位操作的基本知识吗? 我面临以下差异。

System.out.println((~1)&1111); gives 1110. Treating ~1 as 0.
System.out.println((~1)); gives -2. 

2 个答案:

答案 0 :(得分:3)

来自Oracle的official tutorial

  

一元按位补码运算符“〜”反转位模式;它可以应用于任何整数类型,使每个“0”为“1”,每个“1”为“0”

~1获得-2的原因归因于2-complement

0000 0000 0000 0000 0000 0000 0000 0001

倒是

1111 1111 1111 1111 1111 1111 1111 1110

由于Java使用2补码,因此导致-2

将(~1)和1111分解为位:

1111 1111 1111 1111 1111 1111 1111 1110
0000 0000 0000 0000 0000 0100 0101 0111
___________________________________________
0000 0000 0000 0000 0000 0100 0101 0110
基数10中的

0100 0101 01101110

答案 1 :(得分:1)

让我们暂时假设每个数字都有三位。在这种情况下,如果我们想使用带符号的数字(正数和负数),我们会得到这些值为3位 - twos-complement

000 = 0,显然是

001 = 1

010 = 2

011 = 3

100 = -4

101 = -3

110 = -2

111 = -1

所以,如果你用1反转1,这实际上是001(因为〜运算符反转每一位),那么你得到110,这正确地是十进制数-2。

如果你做了1110& 1111,然后你明显得到了1110。