Javaには、右シフト用の2つのビットシフト演算子があります。
>> shifts right, and is dependant on the sign bit for the sign of the result
>>> shifts right and shifts a zero into leftmost bits
http://java.sun.com/docs/books/tutorial/java/nutsandbolts/op3.html
これはかなり単純なように思われるので、このコードがbarに-128の値を与えられたときに、fooに-2の値を生成する理由を誰かが私に説明できますか?
byte foo = (byte)((bar & ((byte)-64)) >>> 6);
これが意味することは、8ビットバイト、左端の2ビットのマスクを取り、それらを右端の2ビットにシフトすることです。すなわち:
initial = 0b10000000 (-128)
-64 = 0b11000000
initial & -64 = 0b10000000
0b10000000 >>> 6 = 0b00000010
結果は実際には-2であり、これは
0b11111110
つまり。ゼロではなく1が左の位置にシフトされます