operadores operaciones logicos con complemento binarios asignacion java bit-shift

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)