50

Why bitwise operation (~0); prints -1 ? In binary , not 0 should be 1 . why ?

5
  • 13
    If you want to flip a single bit, use x ^ 1. Commented Mar 25, 2010 at 7:10
  • 1
    It's not a 'not' operator. It is a 'complement' operator. Commented Mar 25, 2010 at 9:07
  • 1
    @EJP: A one's complement operator. Commented Mar 25, 2010 at 15:48
  • 3
    No it isn't. The language specification #4.2.2 defines "~" as 'the bitwise complement operator'. There is no such thing in Java as a 'bit operator for NOT'. Commented Mar 26, 2010 at 1:16
  • 1
    @lh3: No. It's a one's complement operator in both C and C++. Commented Mar 26, 2010 at 16:41

10 Answers 10

83

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:

Sign up to request clarification or add additional context in comments.

Comments

13

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

Comments

10

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 1 0 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 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! 

Comments

8

~ is a bitwise operator.

~0 = 1 which is -1 in 2's complement form 

http://en.wikipedia.org/wiki/Two's_complement

Some numbers in two's complement form and their bit-wise not ~ (just below them):

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

1 Comment

+1 for the clear example. Programmers that like to puzzle can find out both how ~ works and how two's complement works just from carefully studying your example!
5

Because ~ is not binary inversion, it’s bitwise inversion. Binary inversion would be ! and can (in Java) only be applied to boolean values.

Comments

2

In standard binary encoding, 0 is all 0s, ~ is bitwise NOT. All 1s is (most often) -1 for signed integer types. So for a signed byte type:

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 

Comments

0

It's binary inversion, and in second complement -1 is binary inversion of 0.

Comments

0

0 here is not a bit. It is a byte (at least; or more) - 00000000. Using bitwise or we will have 11111111. It is -1 as signed integer...

Comments

0

For 32 bit signed integer

~00000000000000000000000000000000=11111111111111111111111111111111 (which is -1)

Comments

0

I think the real reason is that ~ is Two’s Complement.

Javascript designates the character tilde, ~, for the two’s complement, even though in most programming languages tilde represents a bit toggle for the one’s complement.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.