wood burning stoves 2.0*
The moose likes Java in General and the fly likes bitwise >>> strange behaviour Big Moose Saloon
  Search | Java FAQ | Recent Topics | Flagged Topics | Hot Topics | Zero Replies
Register / Login
JavaRanch » Java Forums » Java » Java in General
Bookmark "bitwise >>> strange behaviour" Watch "bitwise >>> strange behaviour" New topic
Author

bitwise >>> strange behaviour

Nancy Antony
Ranch Hand

Joined: Sep 06, 2007
Posts: 145

Hi Ranchers,

when I write int i=-1;

i=i>>>31;
System.out.println(i); // i is 1 understood

when I write

int i=-1;
i=i>>>32;
System.out.println(i); // value is -1

Why so?

Regards,
Nancy
Stephan van Hulst
Bartender

Joined: Sep 20, 2010
Posts: 3647
    
  17

All bitwise shift operators use modulo 32 shifting, except if the left operand is a long, then it uses modulo 64 shifting.

Simply said, if you shift your operand by 32 bits, you shift it by 32 % 32 == 0, so you don't shift it at all.

Also, on a slightly related note, you shouldn't use the >>> operator on shorts or bytes, because it can lead to unexpected results.
Ankit Garg
Sheriff

Joined: Aug 03, 2008
Posts: 9305
    
  17

Nancy remember that bitwise operators are not on the exam anymore...


SCJP 6 | SCWCD 5 | Javaranch SCJP FAQ | SCWCD Links
Javin Paul
Ranch Hand

Joined: Oct 15, 2010
Posts: 281


Hi Stephan,

Stephan van Hulst wrote:
Also, on a slightly related note, you shouldn't use the >>> operator on shorts or bytes, because it can lead to unexpected results.


Can you please elaborate this point , I know that >>> (right shift without sign) doesn't filled left most bit with sign bit instead it just fill that with zero.

and as per my knowledge byte ans short are unsigned so eventually it fill zero only but how could it lead to unexpected result ?

Thanks
Javin


http://javarevisited.blogspot.com - java classpath - Java67 - java hashmap - java logging tips java interview questions Java Enum Tutorial
Stephan van Hulst
Bartender

Joined: Sep 20, 2010
Posts: 3647
    
  17

Think about it. What happens to operands of types byte and short before operations are carried out? They get promoted to int.

Here is an illustration. For the sake of brevity, let's say that ints are 16 bits, and shorts are 8 bits.

Nope. The short is sign extended to int before the operation:

This problem gets worse if you use an unsigned right shift compound assignment operator.
Javin Paul
Ranch Hand

Joined: Oct 15, 2010
Posts: 281


Thanks Stephan ,its pretty clear now.
 
Consider Paul's rocket mass heater.
 
subject: bitwise >>> strange behaviour