A byte
- это 8-битное число со знаком с двумя дополнительными знаками.
Если вы считаете, что байт имеет значения 0..255, то вы ошибаетесь.8 битов -128..127, потому что бит 7 является знаковым битом.
Когда вы выполняете битовую манипуляцию с использованием таких операторов, как >>>
, byte
сначала расширяется до int
,это означает, что применяется расширение знака.
Итак, значение без знака 199
(пример) - это биты 11000111
, которые в качестве byte
являются значением -57
aka 0xC7
, и когдазнак, расширенный до int
, становится -57
aka 0xFFFFFFC7
.
Когда вы сдвигаете вправо на 5 (>>> 5
), вы получаете 0x07FFFFFE
aka 134217726
.
Поскольку вас интересуют только самые младшие 3 бита этого значения, вам нужно замаскировать его: (val >>> 5) & 0x07
, что даст вам то, что вы ищете: 0x06
aka 0b110