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 que 0b110101000
, 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:
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); // 168
int
solong
s.