Проблема в том, что все аргументы сначала переводятся в int
до того, как произойдет операция сдвига:
byte b = (byte) 0xf1;
b
подписано, поэтому его значение равно -15.
byte c = (byte) (b >> 4);
b
сначала расширяется до целого числа -15 = 0xfffffff1
, затем смещается вправо до 0xffffffff
и усекается до 0xff
путем приведения к byte
.
byte d = (byte) (b >>> 4);
b
сначала расширяется до целого числа -15 = 0xfffffff1
, затем смещается вправо до 0x0fffffff
и усекается до 0xff
путем приведения к byte
.
Вы можете сделать (b & 0xff) >>> 4
, чтобы получить желаемый эффект.