Why bitwise operation (~0); prints -1 ? In binary , not 0 should be 1 . why ?
10 Answers
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:
- Two's complement
- This is the system used by Java (among others) to represent signed numerical value in bits
- JLS 15.15.5 Bitwise complement operator
~- "note that, in all cases,
~xequals(-x)-1"
- "note that, in all cases,
Comments
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
~ 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 = −1280 1 1 1 1 1 1 0 = 126
1 0 0 0 0 0 0 1 = −1271 1 1 1 1 1 1 1 = −1
0 0 0 0 0 0 0 0 = 01 1 1 1 1 1 1 0 = −2
0 0 0 0 0 0 0 1 = 11 0 0 0 0 0 0 1 = −127
0 1 1 1 1 1 1 0 = 1261 0 0 0 0 0 0 0 = −128
0 1 1 1 1 1 1 1 = 127
1 Comment
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
x ^ 1.