# ~ operator

- 0

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

- 0

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.

- 0

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.

- 0

-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.

- 0

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.

- 0

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.

- 0

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.

It is sorta covered in the JavaRanch Style Guide. |