¿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 va a menos, lo cual es lógico. ¿Cómo puedo hacer que esa cantidad de bits no cambie?
Si desea establecer en 0 todos los bits superiores a los 8 bits inferiores, puede usar AND bit a bit:
int a = (Integer.parseInt("11010100", 2) << 1) & 0xff; System.out.println (Integer.toString(a,2));Producción:
10101000Vamos 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 que 0b110101000 y es 424.
Luego lo convierte en un byte: (byte)(0b11010100 << 1) . Los bits más allá de los primeros 8 se eliminan, lo que deja 0b10101000, que es -88. Menos, sí, porque en Java los bytes están firmados.
Luego, en silencio, convierte este -88 de nuevo en int, mientras lo asigna a un valor int. Sigue siendo -88, lo que significa que todos los bits superiores son todos 1.
Por lo tanto, el valor final es -88 .
Si desea ver 168 en su lugar (que son exactamente los mismos bits, pero se muestran sin firmar en lugar de con firma), el truco habitual es usar & 0xFF , que establece todos los bits excepto los primeros 8 en 0, lo que garantiza un número positivo:
byte b = (byte) (0b11010100 << 1); System.out.println(b); // -88. It is not possible to print 168 when printing a byte. int asUnsigned = b & 0xFF; System.out.println(asUnsigned); // 168. // or in one go: System.out.println(((byte) (0b11010100 << 1)) & 0xFF); // 168Prueba algo como esto:
int anInt = Integer.parseInt("11010100", 2) << 1; int asUnsignedInt= Byte.toUnsignedInt((byte) anInt);toUnsignedInt se ha introducido en Java SE 8.