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
resulten el valor (sin signo) resultante de colocar los 8 bits devalueen los 8 bits más bajos deresult.La razón por la que algo como esto es necesario es que
bytees un tipo firmado en Java. Si acaba de escribir:luego
resultterminaría con el valor enff ff ff felugar de00 00 00 fe. Una sutileza adicional es que&está definido para operar solo en losintvalores 1 , por lo que lo que sucede es:valuese promueve aint(ff ff ff fe).0xffes unintliteral (00 00 00 ff).&aplica para obtener el valor deseadoresult.(El punto es que la conversión
intocurre antes de&que se aplique el operador).1 Bueno, no del todo. El
&operador también trabaja conlongvalores, 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 un0prefijo 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.0xo0bpor sí mismo (sin ningún dígito a continuación) es una sintaxis ilegal en Java.feen 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 unbytevalorfea unintvalorff ff ff fe) se conoce como extensión de signo y es parte de la especificación del lenguaje Java. El propósito devalue & 0xffes 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 (11111111es 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 11111111Se 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
0xffrepresenta00000000000000000000000011111111que 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