我正在尝试进行位操作,有人可以提供可以帮助我解决位操作的基本知识吗? 我面临以下差异。
System.out.println((~1)&1111); gives 1110. Treating ~1 as 0.
System.out.println((~1)); gives -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 0110
为1110
答案 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。