为什么位操作 (~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.


进一步阅读:

其他提示

什么你实际上说的是〜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指定的字符波浪,〜,两个补,即使在大多数编程语言波浪线代表位切换的补数。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top