Por que, quando tento mudar os bits para 11010100 2 , o resultado é 110101000 2 , e não 10101000 2 .
int a = Integer.parseInt("11010100", 2) << 1;
Eu tento fazer isso:
int a = (byte)(Integer.parseInt("11010100", 2) << 1);
Mas se o valor de saída for maior que 128, tudo será menos, o que é lógico. Como posso fazer esse número de bits não mudar?
int
s oulong
s.Respostas:
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 que0b110101000
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:fonte
int a
, por isso, se você tiver& 0xFF
, não precisará lançar nada.int a = (0b11010100<< 1) & 0xFF;
Se você deseja definir como 0 todos os bits mais altos que os 8 bits inferiores, pode usar AND bit a bit:
Resultado:
fonte
Tente algo como isto:
toUnsignedInt foi introduzido no Java SE 8.
fonte