Win a copy of The Way of the Web Tester: A Beginner's Guide to Automating Tests this week in the Testing forum!

# bitwise >>> strange behaviour

Nancy Antony
Ranch Hand
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
Posts: 6486
83
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
Posts: 9543
33
Nancy remember that bitwise operators are not on the exam anymore...

Javin Paul
Ranch Hand
Posts: 295

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

Stephan van Hulst
Bartender
Posts: 6486
83
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
Posts: 295

Thanks Stephan ,its pretty clear now.