题
为什么位操作 (~0);
prints-1?在二元,不0应该是1。为什么?
解决方案
你实际上是相当接近。
在二,不应该是1 0
是的,这是绝对正确,当我们谈论的是一个位。
然而,一个 int
其数值为0实际上是32位的所有零! ~
反转的所有32零32人。
System.out.println(Integer.toBinaryString(~0));
// prints "11111111111111111111111111111111"
这是两个补代表 -1
.
同样:
System.out.println(Integer.toBinaryString(~1));
// prints "11111111111111111111111111111110"
也就是说,对于一个32位无符号 int
在两个补代表, ~1 == -2
.
进一步阅读:
- 两个补
- 这是该系统用于通过Java(其他)代表签署了数值中的比特
- 捷尔思15.15.5位的补充操作员
~
- "注意的是,在所有情况下,
~x
等于(-x)-1
"
- "注意的是,在所有情况下,
其他提示
什么你实际上说的是〜00000000和0xFFFFFFFF的的结果。用于在Java(signed)int的,这意味着-1。
您可以想像在一个符号数的第一位是 - (2 X -1 ),其中x是比特数
。因此,给定一个8位数字,每一个比特的值(在从左到右的顺序)为:
-128 64 32 16 8 4 2 1
现在,在二进制0显然是全0:
-128 64 32 16 8 4 2 1
0 0 0 0 0 0 0 0 0 = 0
和当您执行按位不~
每个这些0的成为1:
-128 64 32 16 8 4 2 1
~0 1 1 1 1 1 1 1 1
= -128+64+32+16+8+4+2+1 == -1
这也有利于在理解溢出:
-128 64 32 16 8 4 2 1
126 0 1 1 1 1 1 1 0 = 126
+1 0 1 1 1 1 1 1 1 = 127
+1 1 0 0 0 0 0 0 0 = -128 overflow!
~
是位运算符。
~0 = 1 which is -1 in 2's complement form
http://en.wikipedia.org/wiki/Two's_complement
在二进制补码形式的一些数字和他们的逐位不~
(略低于它们):
0 1 1 1 1 1 1 1 = 127,点击 1 0 0 0 0 0 0 0 = -128
0 1 1 1 1 1 1 0 = 126,点击 1 0 0 0 0 0 0 1 = -127
1 1 1 1 1 1 1 1 = -1,点击 0 0 0 0 0 0 0 0 = 0
1 1 1 1 1 1 1 0 = -2,点击 0 0 0 0 0 0 0 1 = 1
1 0 0 0 0 0 0 1 = -127,点击 0 1 1 1 1 1 1 0 = 126
1 0 0 0 0 0 0 0 = -128,点击 0 1 1 1 1 1 1 1 = 127
由于~
不是二进制反转,这是按位反转。二进制反转将!
并且可以(在Java中)仅被施加到布尔值。
在标准二进制编码,0是全0,~
是按位非。全1是(最常见)-1符号整型。因此,对于一个带符号字节类型:
0xFF = -1 // 1111 1111
0xFE = -2 // 1111 1110
...
0xF0 = -128 // 1000 0000
0x7F = 127 // 0111 1111
0x7E = 126 // 0111 1110
...
0x01 = 1 // 0000 0001
0x00 = 0 // 0000 0000
它是二进制的反转,在第二补体-1是0的二进制反转。
0这里不是一个比特。这是一个字节(至少或更大) - 00000000使用按位或我们将有11111111它是-1作为带符号的整数...
有关的32位带符号的整数
~00000000000000000000000000000000=11111111111111111111111111111111
(其为-1)
我认为真正的原因是〜是二进制补码。
的Javascript指定的字符波浪,〜,两个补,即使在大多数编程语言波浪线代表位切换的补数。