Как уже говорилось в других ответах, (currentByte & 0x7F) | (currentByte & 0x80)
эквивалентно (currentByte & 0xFF)
. JLS3 15.22.1 говорит, что это повышен до int
:
Когда оба операнда оператора &,
^ или | имеют тип, который
обратимый (§5.1.8) к примитиву
целочисленный тип, двоичное число
продвижение сначала выполняется на
операнды (§5.6.2). Тип
побитовое выражение оператора является
повышенный тип операндов.
потому что JLS3 5.6.2 говорит, что когда currentByte
имеет тип byte
и 0x7F
является int
(и это так), тогда оба операнда переводятся в int
.
Следовательно, buffer
будет массивом типа элемента int
или шире.
Теперь, выполняя & 0xFF
для int
, мы эффективно отображаем исходный диапазон byte
-128..127 в диапазон без знака 0..255, например, операция, часто используемая потоками java.io
. .
Вы можете увидеть это в действии в следующем фрагменте кода. Обратите внимание: чтобы понять, что здесь происходит, вы должны знать, что Java хранит целочисленные типы, кроме char
, в качестве дополнения 2 к значениям .
byte b = -123;
int r = b;
System.out.println(r + "= " + Integer.toBinaryString(r));
int r2 = b & 0xFF;
System.out.println(r2 + "= " + Integer.toBinaryString(r2));
Наконец, для реального примера посмотрите Javadoc и реализацию java.io.ByteArrayInputStream
метода *1038*:
/**
* Reads the next byte of data from this input stream. The value
* byte is returned as an <code>int</code> in the range
* <code>0</code> to <code>255</code>. If no byte is available
* because the end of the stream has been reached, the value
* <code>-1</code> is returned.
*/
public synchronized int read() {
return (pos < count) ? (buf[pos++] & 0xff) : -1;
}