Это немного касательно, но если вы пытаетесь работать со знаковыми байтами, следующее может оказаться полезным.
Поскольку большинство операций будут продвигать Java byte
до int
- с сохранением знака и величины & ndash; очень часто маскируют старшие биты, например:
/* Convert two bytes from an array to a 16-bit, unsigned value. */
int val = (b[idx] & 0xFF) << 8 | (b[idx + 1] & 0xFF);
Перед применением оператора &
(и большинства других операторов) byte
расширяется до int
(или даже long
, в зависимости от контекста). Таким образом, значение байта со знаком 0xFF
преобразуется в целочисленное значение со знаком 0xFFFFFF
.
Но обычно при выполнении побитовых операций намерение обрабатывать каждый байт как значение без знака, поэтому byte
0xFF
(-1) должно быть просто int
0xFF
(255). Маскирование с помощью 0xFF
выполняет это.