Pourquoi quand j'essaye de décaler des bits pour 11010100 2 , le résultat est 110101000 2 , pas 10101000 2 .
int a = Integer.parseInt("11010100", 2) << 1;
J'essaye de faire ça:
int a = (byte)(Integer.parseInt("11010100", 2) << 1);
Mais si la valeur de sortie est supérieure à 128, tout passe en moins, ce qui est logique. Comment puis-je faire en sorte que le nombre de bits ne change pas?
int
s oulong
s.Réponses:
Prenons-le une étape à la fois.
Integer.parseInt("11010100", 2)
- c'est la valeur int 212. Cela est d'ailleurs inutile; vous pouvez simplement écrire:0b11010100
.0b11010100 << 1
est le même que0b110101000
424.Vous Rabattre ensuite à un octet:
(byte)(0b11010100 << 1)
. Les bits au-delà des 8 premiers sont tous supprimés, ce qui laisse 0b10101000, qui est -88. Moins, oui, car en java, les octets sont signés.Vous avez ensuite casté silencieusement ce -88 en int, comme vous l'affectez à une valeur int. Il reste -88, ce qui signifie que tous les bits supérieurs sont tous des 1.
Par conséquent, la valeur finale est
-88
.Si vous voulez voir à la
168
place (qui sont exactement les mêmes bits, mais affichés non signés au lieu de signés), l'astuce habituelle est d'utiliser& 0xFF
, qui définit tous les bits sauf les 8 premiers à 0, garantissant ainsi un nombre positif:la source
int a
, donc si vous en avez& 0xFF
, alors vous n'avez pas besoin de lancer du tout.int a = (0b11010100<< 1) & 0xFF;
Si vous souhaitez mettre à 0 tous les bits supérieurs aux 8 derniers bits, vous pouvez utiliser les bits ET:
Production:
la source
Essayez quelque chose comme ceci:
toUnsignedInt a été introduit dans Java SE 8.
la source