Como las otras respuestas ya se ha dicho, es equivalente a (currentByte & 0x7F) | (currentByte & 0x80)
(currentByte & 0xFF)
.El JLS3 15.22.1 dice que esto es promovido a un int
:
Cuando ambos operandos de un operador &, ^ o | son de un tipo que es convertible (§5.1.8) a un tipo integral primitivo , la promoción numérica binaria se realiza primero en los operandos (§5.6.2). El tipo de expresión de operador bit a bit es el tipo promocionado de los operandos.
porque JLS3 5.6.2 dice que cuando currentByte
tiene tipo byte
y 0x7F
es un int
(y este es el caso), entonces los dos operandos son promovidos a int
.
Por lo tanto, buffer
será una matriz del elemento tipo int
o más.
Ahora, mediante la realización de & 0xFF
en una int
, que efectivamente en el mapa los byte
gama original -128..127 en el rango 0..255 sin firmar, una operación a menudo utilizado por java.io
corrientes, por ejemplo.
Puede ver esto en acción en el siguiente fragmento de código. Tenga en cuenta que para comprender lo que está sucediendo aquí, debe saber que Java almacena tipos integrales, excepto char
, como valores 2's complement.
byte b = -123;
int r = b;
System.out.println(r + "= " + Integer.toBinaryString(r));
int r2 = b & 0xFF;
System.out.println(r2 + "= " + Integer.toBinaryString(r2));
Por último, para un ejemplo del mundo real, echa un vistazo a la Javadoc y la aplicación del método de java.io.ByteArrayInputStream
read
:
/**
* 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;
}
¡LOL, esto es con lo que tengo que trabajar! :) – Dave
Ambos son matrices os bytes Probé la sugerencia de Timbo, y se fubared cuando se cambió: -/ – Dave
el búfer es del tipo de elemento int o más ancho, de lo contrario no debería compilarse. – eljenso