4
votes

Java XOR avec perte entre les caractères

Je ne sais pas comment le XOR est censé être "correctement" effectué entre les caractères en Java. J'ai vu d'autres faire cela, mais quand j'ai quelque chose d'aussi simple que:

char a = 'a';
char b = 'b';
char c = (char) a ^ b;

J'obtiens une erreur de compilation "possible avec perte de int en char". Je ne sais pas comment les intrants sont intégrés dans ce contexte.


0 commentaires

3 Réponses :


2
votes

L'opérateur caret (xor) fonctionne sur les valeurs int. Vos variables char et b sont implicitement promues au type int pour rendre cela possible. Cette partie fonctionne sans perte de précision.

Mais alors votre code force la valeur int à revenir dans le type char. Vous pouvez simplement faire c de type int pour résoudre ce problème, ou en utilisant correctement les parenthèses.


2 commentaires

OK merci! Y a-t-il un moyen de réellement xor chars alors, puisque j'essaye de XOR certaines entrées à des fins de cryptage


Ne travaillez pas sur les caractères. Convertissez-les en octets et gardez à l'esprit l'encodage!



5
votes

Lorsque vous utilisez ^ sur un char , l'opération est effectuée dans la valeur int de char .

En raison de la priorité des opérateurs , le casting vient avant le ^ .

Cela signifie qu'il se compile vers

char c = (char) (a ^ b);

Puisque le casting vient en premier, la promotion vers un int a lieu en dernier, et vous allez essayer d'attribuer un int à un caractère

Vous voulez utiliser des parenthèses:

((char) a) ^ b


2 commentaires

Belle, j'ai d'abord négligé ce détail subtil :-)


Merci! Maintenant, il compile réellement!



1
votes

Je ne suis pas sûr de la manière dont les intestins sont intégrés dans ce contexte.

Dans votre exemple, le XOR de deux caractères pourrait potentiellement chevaucher la plage du type char, donc le compilateur produit un int pour cette instruction.
Tandis qu'ici ce n'est pas le cas puisque 97 ^ 98 est 3 mais comme les variables a et b ne le sont pas final , ceux-ci peuvent être modifiés ultérieurement et le compilateur n'accepte donc pas d'attribuer le résultat à un char .
Utilisez des valeurs constantes ou insérez-les et vous n'avez pas besoin de transtypage:

char c =  (char) (a ^ b);

Sinon, réduisez le résultat de l'opération XOR à un caractère uniquement si vous êtes sûr que ce ne sera pas le cas créer un effet secondaire:

final char a = 'a';
final char b = 'b';
char c =  a ^ b;

0 commentaires