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.
3 Réponses :
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.
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!
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
Belle, j'ai d'abord négligé ce détail subtil :-)
Merci! Maintenant, il compile réellement!
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 puisque97 ^ 98
est3
mais comme les variablesa
etb
ne le sont pasfinal
, ceux-ci peuvent être modifiés ultérieurement et le compilateur n'accepte donc pas d'attribuer le résultat à unchar
.
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;