按位不是运算符

时间:2010-03-25 06:39:50

标签: java javascript c++ c twos-complement

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

10 个答案:

答案 0 :(得分:68)

你实际上非常接近。

  

在二进制中,不是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


进一步阅读:

答案 1 :(得分:13)

你实际上说的是~0x00000000并导致0xFFFFFFFF。对于java中的(带符号)int,这意味着-1。

答案 2 :(得分:9)

你可以想象有符号数中的第一位是 - (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!

答案 3 :(得分:7)

~是一个按位运算符。

~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 0 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

答案 4 :(得分:3)

因为~不是二进制反转,所以它是按位反转。二进制反转将是!并且可以(在Java中)仅应用于布尔值。

答案 5 :(得分:1)

在标准二进制编码中,0全为0,~为按位NOT。对于有符号整数类型,所有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

答案 6 :(得分:0)

它是二进制反转,在第二个补码-1中是0的二进制反转。

答案 7 :(得分:0)

0这里没有一点。它是一个字节(至少;或更多) - 00000000。使用按位或我们将有11111111.它是-1作为有符号整数...

答案 8 :(得分:0)

对于32位有符号整数

~00000000000000000000000000000000=11111111111111111111111111111111(即-1)

答案 9 :(得分:0)

我认为真正的原因是〜是Two's Complement。

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