¿Por qué cuando trato de cambiar bits para 11010100 2 , el resultado es 110101000 2 , no 10101000 2 ?
int a = Integer.parseInt("11010100", 2) << 1;
Intento hacer esto:
int a = (byte)(Integer.parseInt("11010100", 2) << 1);
Pero si el valor de salida es mayor que 128, todo entra en menos, lo cual es lógico. ¿Cómo puedo hacer que ese número de bits no cambie?
int
solong
s.Respuestas:
Vamos a dar un paso a la vez.
Integer.parseInt("11010100", 2)
- este es el valor int 212. Esto es, por cierto, innecesario; simplemente puede escribir:0b11010100
.0b11010100 << 1
es lo mismo que0b110101000
, y es 424.A continuación, la echó a un byte:
(byte)(0b11010100 << 1)
. Los bits más allá de los primeros 8 se cortan, lo que deja 0b10101000, que es -88. Menos, sí, porque en Java los bytes están firmados.Luego, silenciosamente, devuelve este -88 a int, mientras lo asigna a un valor int. Sigue siendo -88, lo que significa que todos los bits superiores son todos 1s.
Por lo tanto, el valor final es
-88
.Si desea ver en su
168
lugar (que son exactamente los mismos bits, pero se muestran sin signo en lugar de con signo), el truco habitual es usar& 0xFF
, que establece todos los bits excepto los primeros 8 a 0, garantizando así un número positivo:fuente
int a
, así que si lo tienes& 0xFF
, entonces no necesitas lanzar nada.int a = (0b11010100<< 1) & 0xFF;
Si desea establecer en 0 todos los bits más altos que los 8 bits inferiores, puede usar Y en cuanto a bits:
Salida:
fuente
Intenta algo como esto:
toUnsignedInt se ha introducido en Java SE 8.
fuente