The statement
b1 >>>= 1;
is a compound statement that is equivalent to
b1 = (byte)(b1 >>> 1);
The part in the parentheses shows a byte variable getting bitshifted to the
right with the unsigned right shift operator. This means that b1 will be
promoted to an int so its bit
pattern will be:
11111111111111111111111111110011
which is -13.
Then it will be shifted right one place, with a leading zero added on to
the left side, because that's how >>> works:
01111111111111111111111111111001
which is positive 2147483641 because the 0 on the left end is the sign bit
for this 32-bit int value. The number is positive because the leftmost bit
is a 0.
So (b1 >>> 1) evalutes to 2147483641.
The statement can now be rewritten:
b1 = (byte)(2147483641);
The next step is to cast this value explicitly to a byte. Since its current
bit pattern is
01111111111111111111111111111001
casting it to a byte will discard the high-order 24 bits (the ones on the
left). Here's that value with x's for the bits that will be discarded:
xxxxxxxxxxxxxxxxxxxxxxxx11111001
After discarding those bits, the resulting byte has the bit pattern
11111001
which is now negative because the leftmost bit is 1. This value is -7.
The statement can now be rewritten:
b1 = -7;
If b1 had been an int or long instead of a byte, then you could assume that
the result of
b1 >>>= 1;
would be positive, since >>> puts a zero on the left. However,
because of the cast to byte, there's no certainty that the result will be
positive or negative until you work through the problem, since the sign bit
of the int gets discarded, and whatever bit happens to be in the 8th place
from the right will be the sign bit of the byte that results from the cast
to byte. In this case that bit is a 1, so the byte is negative.
[ May 05, 2005: Message edited by: Joe Sanowitz ]
[ May 05, 2005: Message edited by: Joe Sanowitz ]