# ~ operator

For example,

int x = 9;

x = ~ x;

Step 1: Convert 9 to binary: 1001

Step 2: Since the signed bit is one, the answer should be a negative integer

Step 3: Now convert 0's to 1 and one's to 0. That is, 0110

Step 4: The answer: -6.

This is wrong. The answer is -10.

What am I doing wrong here? Please explain.

Thanks

Now we have a bit pattern that we must convert to decimal. The high bit is 1 so it's negative. So let's take the two's complement and then afterwards call the number negative again.

So our answer is the

**negative**of this: -10.

Ask a Meaningful Question and HowToAskQuestionsOnJavaRanch

Getting someone to think and try something out is much more useful than just telling them the answer.

Follow the steps below

Step 1> Represent 9 in 32 bit integer form.

0000 0000 0000 0000 0000 0000 0000 1001 = 9

Step 2> One's complement of 9

1111 1111 1111 1111 1111 1111 1111 0110

Step 3> To get the final answer do 2's complement on the result obtained in step 2 and add the negative sign.

Hope this helps you.

**Always represent number in full 32 bit integer form This is very important when you are trying to play around with bit operators.**

Cheers,<br />Jay<br /> <br />(SCJP 1.4)<br />Heights of great men were not achieved in one day, they were toiling day and night while their companions slept.

-x == ~x + 1 // the negative is found by flipping the bits (~x) and adding 1

Subtracting 1 from both sides:

-x - 1 == ~x

That is:

~x == -(x + 1)

So for example: ~9 == -(9 + 1) == -10.

Exercise: does it work if x < 0? for Integer.MAX_VALUE? for Integer.MIN_VALUE?

[ December 06, 2004: Message edited by: Barry Gaunt ]

Ask a Meaningful Question and HowToAskQuestionsOnJavaRanch

Getting someone to think and try something out is much more useful than just telling them the answer.

It works for x <0, x= Integer.MAX_VALUE, Integer.MIN_VALUE.

So, this is all I need to know for ~x. Or do I definitely need to do it the long way - converting to one's compliment and then adding 1 to the result? Let me know so that I can move on.

Thanks once again.

For Integer.MIN_VALUE , the formula doesn't hold good. However, for ~Integer.MAX_VALUE will give you Integer.MIN_VALUE as per the formula.

In short,

**~Integer.MIN_VALUE = Integer.MAX_VALUE**

~Integer.MAX_VALUE = Integer.MIN_VALUE

~Integer.MAX_VALUE = Integer.MIN_VALUE

Cheers,<br />Jay<br /> <br />(SCJP 1.4)<br />Heights of great men were not achieved in one day, they were toiling day and night while their companions slept.

Originally posted by Jay Pawar:

Sumitabh,

For Integer.MIN_VALUE , the formula doesn't hold good. However, for ~Integer.MAX_VALUE will give you Integer.MIN_VALUE as per the formula.

In short,

~Integer.MIN_VALUE = Integer.MAX_VALUE

~Integer.MAX_VALUE = Integer.MIN_VALUE

But interestingly:

prints: true true

You have to think in a 32bit universe you see. And -2147483649 is not in that universe.

Ask a Meaningful Question and HowToAskQuestionsOnJavaRanch

Getting someone to think and try something out is much more useful than just telling them the answer.