按位不算操作符

为什么按位操作(~0); 打印-1? 在二进制中,不是0应该是1。 为什么?

你其实非常接近。

在二进制中,不是0应该是1

是的,当我们谈论一点时,这是绝对正确的。

然而,值为0的int实际上是全零的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(或其他)用来表示带符号数值的系统
  • JLS 15.15.5按位补码运算符~
    • “请注意,在所有情况下, ~x等于(-x)-1

你实际上说的是〜0x00000000,结果是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

一些数字用二的补码forms表示,而他们的比特不是~ (就在他们的下面):

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, ~是按位NOT。 对于有符号整数types,所有1都是(最经常)-1。 所以对于有符号的字节types:

 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这里没有一点。 它是一个字节(至less;或更多) – 00000000.使用按位或我们将有11111111.它是-1作为有符号整数…

对于32位有符号整数

~00000000000000000000000000000000=11111111111111111111111111111111 (这是-1)

我认为真正的原因是〜是二的补。

Javascript指定了字符tilde,〜表示二进制补码,即使在大多数编程语言中,tilde代表一个补码的位切换。