operaciones - operadores de asignacion en java
Comportamiento del desplazamiento a la derecha sin signo aplicado a la variable de byte (4)
El problema es que todos los argumentos se promueven primero a int
antes de que tenga lugar la operación de cambio:
byte b = (byte) 0xf1;
b
está firmado, por lo que su valor es -15.
byte c = (byte) (b >> 4);
b
es primer signo extendido al entero -15 = 0xfffffff1
, luego se desplaza a la derecha a 0xffffffff
y se trunca a 0xff
por la 0xffffffff
a byte
.
byte d = (byte) (b >>> 4);
b
es primer signo extendido al número entero -15 = 0xfffffff1
, luego se desplaza a la derecha a 0x0fffffff
y se trunca a 0xff
por la 0x0fffffff
a byte
.
Puedes hacer (b & 0xff) >>> 4
para obtener el efecto deseado.
Considere el siguiente fragmento de código java
byte b=(byte) 0xf1;
byte c=(byte)(b>>4);
byte d=(byte) (b>>>4);
salida:
c=0xff
d=0xff
Rendimiento esperado:
c=0x0f
¿cómo? como b en el binario 1111 0001
después del turno derecho sin signo 0000 1111
por 0x0f
tanto 0x0f
pero ¿por qué es 0xff
cómo?
Java intenta escatimar en tener soporte explícito para tipos básicos sin firma definiendo los dos operadores de cambio diferentes en su lugar.
La pregunta habla sobre el cambio a la derecha sin signo, pero los ejemplos hacen ambas cosas (con signo y sin signo) y muestran el valor del cambio con signo (>>).
Sus cálculos serían correctos para un turno sin firmar (>>>).
Según los operadores de Bitwise y Bit Shift :
El operador de cambio a la derecha sin signo ">>>" desplaza un cero a la posición más a la izquierda, mientras que la posición más a la izquierda después de ">>" depende de la extensión de la señal.
Así que con b >> 4
transforma 1111 0001
a 1111 1111
(b es negativo, por lo que agrega 1
) que es 0xff
.
Supongo que b
es el signo extendido a int
antes de cambiar.
Así que esto podría funcionar como se esperaba:
(byte)((0x000000FF & b)>>4)