Behaviour of unsigned right shift applied to byte variable

The problem is that all arguments are first promoted to int before the shift operation takes place:

byte b = (byte) 0xf1;

b is signed, so its value is -15.

byte c = (byte) (b >> 4);

b is first sign-extended to the integer -15 = 0xfffffff1, then shifted right to 0xffffffff and truncated to 0xff by the cast to byte.

byte d = (byte) (b >>> 4);

b is first sign-extended to the integer -15 = 0xfffffff1, then shifted right to 0x0fffffff and truncated to 0xff by the cast to byte.

You can do (b & 0xff) >>> 4 to get the desired effect.


According to Bitwise and Bit Shift Operators:

The unsigned right shift operator ">>>" shifts a zero into the leftmost position, while the leftmost position after ">>" depends on sign extension.

So with b >> 4 you transform 1111 0001 to 1111 1111 (b is negative, so it appends 1) which is 0xff.


I'd guess that b is sign extended to int before shifting.

So this might work as expected:

(byte)((0x000000FF & b)>>4)

Tags:

Java

Bit Shift