Причина "странного" результата битового сдвига заключается в том, что значения расширены до 32 бит (int
) до сдвига.
I.е.-38
здесь не 1101 1010
, а 1111 1111 1111 1111 1111 1111 1101 1010
.
Что должно объяснить, почему -38 >>> 26
равен 0000 0000 0000 0000 0000 0000 0011 1111
(или 63
).
Расширение описано в Спецификации языка Java :
В противном случае, если операнд имеет тип времени компиляции byte
, short
или char
, он преобразуется в значение типа int
с помощью расширяющегося примитивного преобразования (§5.1.2).
Если вы хотите выполнить операции сдвига битов над 8-битным (byte
) значением, вы можете mask использовать только значениемладшие 8 бит после расширения, но перед сдвигом, как предлагает Федерико:
byte x = -38;
(x & 0xFF) >>> 26;
Это даст ожидаемое значение 0 (хотя я не уверен, имеет ли это смысл, так как любое 8-битное значение будетбыть 0, если вы сдвигаете вправо более чем на 8).