Vamos dar um passo de cada vez.
Integer.parseInt("11010100", 2)
- este é o valor int 212. A propósito, isso é desnecessário; você pode apenas escrever: 0b11010100
.
0b11010100 << 1
é o mesmo que 0b110101000
e é 424.
Você, então, lançá-lo para um byte: (byte)(0b11010100 << 1)
. Os bits além dos 8 primeiros são cortados, deixando 0b10101000, que é -88. Menos, sim, porque em java bytes são assinados.
Em seguida, você converte -88 silenciosamente em int, ao atribuí-lo a um valor int. Permanece -88, o que significa que todos os bits superiores são 1s.
Portanto, o valor final é -88
.
Se você deseja ver 168
(que são exatamente os mesmos bits, mas mostrados sem sinal em vez de assinar), o truque usual é usar & 0xFF
, que define todos os bits, exceto os primeiros 8 a 0, garantindo assim um 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
s oulong
s.