Tengo el siguiente código Java:
byte value = 0xfe; // corresponds to -2 (signed) and 254 (unsigned)
int result = value & 0xff;
El resultado es 254 cuando se imprime, pero no tengo idea de cómo funciona este código. Si el &
operador es simplemente bit a bit, ¿por qué no da como resultado un byte y, en cambio, un entero?
java
integer
byte
bitwise-and
dagronlund
fuente
fuente
byte value = (byte) 0xfe;
Respuestas:
Se establece
result
en el valor (sin signo) resultante de colocar los 8 bits devalue
en los 8 bits más bajos deresult
.La razón por la que algo como esto es necesario es que
byte
es un tipo firmado en Java. Si acaba de escribir:luego
result
terminaría con el valor enff ff ff fe
lugar de00 00 00 fe
. Una sutileza adicional es que&
está definido para operar solo en losint
valores 1 , por lo que lo que sucede es:value
se promueve aint
(ff ff ff fe
).0xff
es unint
literal (00 00 00 ff
).&
aplica para obtener el valor deseadoresult
.(El punto es que la conversión
int
ocurre antes de&
que se aplique el operador).1 Bueno, no del todo. El
&
operador también trabaja conlong
valores, si alguno de los operandos es unlong
. Pero no enbyte
. Consulte la Especificación del lenguaje Java, secciones 15.22.1 y 5.6.2 .fuente
0x
(o0X
) le dice a Java que el literal entero que sigue debe interpretarse como hexadecimal (base 16). Java también admite un0
prefijo simple para literales octales y un prefijo0b
(o0B
) para literales binarios. Consulte la Especificación del lenguaje Java para obtener más información en literales enteros.0x
o0b
por sí mismo (sin ningún dígito a continuación) es una sintaxis ilegal en Java.fe
en complemento a dos de 8 bits corresponde al valor decimal −2. Para conservar el valor,Integer.valueOf(byte)
necesitaría producirff ff ff fe
(−2 en 32 bits, complemento a dos), no00 00 00 fe
(valor decimal 254). Esta transformación (de unbyte
valorfe
a unint
valorff ff ff fe
) se conoce como extensión de signo y es parte de la especificación del lenguaje Java. El propósito devalue & 0xff
es deshacer la extensión del signo (es decir, simular la extensión cero, algo que Java no tiene).De http://www.coderanch.com/t/236675/java-programmer-SCJP/certification/xff
El literal hexadecimal 0xFF es un int (255) igual. Java representa int como 32 bits. Se ve así en binario:
Cuando lo hace un poco Y con este valor (255) en cualquier número, va a enmascarar (hacer CERO) todos menos los 8 bits más bajos del número (será como está).
& es algo así como% pero no realmente .
¿Y por qué 0xff? esto en ((potencia de 2) - 1). Todos ((potencia de 2) - 1) (por ejemplo, 7, 255 ...) se comportarán de forma similar al operador%.
Luego,
en binario, 0 es, todo ceros y 255 se ve así:
Y -1 se ve así
Cuando hace un AND bit a bit de 0xFF y cualquier valor de 0 a 255, el resultado es exactamente el mismo que el valor. Y si todavía hay algún valor superior a 255, el resultado estará entre 0-255.
Sin embargo, si lo hace:
usted obtiene
00000000 00000000 00000000 11111111
, que NO es igual al valor original de -1 (11111111
es 255 en decimal).Verifique que cualquier bit en particular esté establecido (1) o no (0) luego
Establecer (1) un bit en particular
Restablecer (0) un bit en particular
XOR
Solo tenga en cuenta que si realiza la operación XOR dos veces, obtendrá el mismo valor.
Una lógica más con XOR es
Lo anterior es útil para intercambiar dos variables sin temperatura como a continuación
O
fuente
Ayuda a reducir muchos códigos. Ocasionalmente se utiliza en valores RGB que constan de 8 bits.
donde 0xff significa 24 (0's) y 8 (1's) como
00000000 00000000 00000000 11111111
Se ve más en casos como cuando se intenta transformar valores de color de un formato especial a valores RGB estándar (que tiene una longitud de 8 bits).
Gran explicación ver aquí
fuente
En el sistema de formato de 32 bits, el valor hexadecimal
0xff
representa00000000000000000000000011111111
que está255(15*16^1+15*16^0)
en decimal. y el operador & bit a bit enmascara los mismos 8 bits más a la derecha que en el primer operando.fuente