Comment puis-je inverser des bits d'un octet non signé en Java?
Je suis en train d'écrire un décodeur pour un type très simple de chiffrement. Les nombres de 0 à 255 sont entrés via un Scanner, les bits sont inversés, et puis converti en caractère et de l'imprimé.
Par exemple, le nombre de 178 devraient se convertir à la lettre "M".
178 est 10110010.
En inversant tous les bits devrait donner 01001101, qui est de 77 ou "M" comme un caractère.
Le principal problème que j'ai c'est que, aussi loin que je peux dire, Java ne supporte pas d'octets non signés. J'ai pu lire des valeurs comme un int ou un court, mais alors les valeurs doivent être hors tension lors de la conversion en raison de l'extra. Idéalement, je pouvais au niveau du bit opérateur de complément, mais je pense que je vais finir par avoir des valeurs négatives si je fais cela avec des nombres signés. Des idées sur comment je dois aborder cette?
source d'informationauteur DavidKelly999
Vous devez vous connecter pour publier un commentaire.
Je voudrais simplement utiliser ceux de compléter et de se débarrasser des autres bits en utilisant le binaire et le.
~
ne le complément et les convertit implicitement à un nombre entier comme tous les numériques les opérations faites, alors& 0xff
masque tout, sauf la partie inférieure 8 bits pour obtenir la valeur non signée, de nouveau comme un entier.J'ai lu votre question différemment, d'inverser l'ordre à la place des valeurs des bits, et ce fut la réponse.
Vous pouvez utiliser
Integer.reverse()
(non testé):Des opérations bit à bit en Java sont définis pour
int
il est donc logique de travailler avecint
plutôt quebyte
. Vous pouvez utiliserScanner.nextInt
plutôt que deScanner.nextByte
. Vous devez valider la saisie de l'utilisateur de s'assurer que tous les entiers sont entrés dans la plage de 0 à 255 et afficher un message d'erreur approprié si un numéro est rencontré.Une fois que vous avez le numéro stocké dans un entier puis de retourner le moins significatif de 8 bits, vous pouvez XOR avec 0xff. Cela devrait fonctionner comme prévu pour toutes les entrées entre 0 et 255:
Exemple:
Résultat:
Si Java prend en charge ce, vous avez pu lire dans un plus grand type, au niveau du bit-compliment, puis masque de bits les indésirables bits.
La façon la plus simple pour ce faire est de trois étapes:
int i = scanner.nextByte();
i = ~i;
i = i & 0xFF;
Puis il suffit d'utiliser le résultat comme un personnage (qui est en fait 16 bits de java, mais nous les utiliserons seulement 8 d'entre eux):
Tous ensemble:
Voici Java octets, triés par représentation binaire (à partir de 00000000 à 11111111):
0, 1, 2, .., 126, 127, -128, -127, .., -2, -1
00000000 est 0, 11111111 est -1
Inversé 0 -1, inversé 1 est de -2, ..., inversé -128 à 127.
Donc si vous voulez inverser les bits de Java, vous devriez obtenir votre octet de signe opposé et soustraire un: