bitwise not operator bitwise not operator c c

bitwise not operator


You are actually quite close.

In binary , not 0 should be 1

Yes, this is absolutely correct when we're talking about one bit.

HOWEVER, an int whose value is 0 is actually 32 bits of all zeroes! ~ inverts all 32 zeroes to 32 ones.

System.out.println(Integer.toBinaryString(~0));// prints "11111111111111111111111111111111"

This is the two's complement representation of -1.

Similarly:

System.out.println(Integer.toBinaryString(~1));// prints "11111111111111111111111111111110"

That is, for a 32-bit unsigned int in two's complement representation, ~1 == -2.


Further reading:


What you are actually saying is ~0x00000000 and that results in 0xFFFFFFFF. For a (signed) int in java, that means -1.


You could imagine the first bit in a signed number to be -(2x -1) where x is the number of bits.

So, given an 8-bit number, the value of each bit (in left to right order) is:

-128 64 32 16 8 4 2 1

Now, in binary, 0 is obviously all 0s:

    -128 64 32 16 8 4 2 10      0  0  0  0 0 0 0 0 = 0

And when you do the bitwise not ~ each of these 0s becomes a 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

This is also helpful in understanding overflow:

     -128 64 32 16 8 4 2 1126     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!