Consider the following snip of java code
byte b=(byte) 0xf1;
byte c=(byte)(b>>4);
byte d=(byte) (b>>>4);
output:
c=0xff
d=0xff
expected output:
c=0x0f
how?
as b in binary 1111 0001
after unsigned right shift 0000 1111
hence 0x0f
but why is it 0xff
how?
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.