Afshin Mehrabani Afshin Mehrabani - 7 months ago 27
Javascript Question

Why does bitwise "not 1" equal -2?

Suppose we have

1
and this number in base 2 is:

00000000000000000000000000000001


Now I want to flip all bits to get following result:

11111111111111111111111111111110


As far as I know, the solution is to use the
~
(bitwise NOT operator) to flip all bits, but the result of
~1
is
-2
:

console.log(~1); //-2
console.log((~1).toString(2)); //-10 (binary representation)


Why do I get this strange result?

Answer

There are 2 integers between 1 and -2: 0 and -1

1   in binary is 00000000000000000000000000000001
0   in binary is 00000000000000000000000000000000
-1 in binary is 11111111111111111111111111111111
-2 in binary is 11111111111111111111111111111110
("binary" being 2's complement, in the case of a bitwise not ~ )

As you can see, it's not very surprising ~1 equals -2, since ~0 equals -1.

As @Derek explained, These bitwise operators treat their operands as a sequence of 32 bits. parseInt, on the other hand, does not. That is why you get some different results.