HOWTO · Java
L’opérateur XOR en Java
Utilisez l’opérateur ^ de Java pour le XOR booléen et entier, avec des exemples testés et les pièges courants.
Sur cette page
En Java, ^ est l’opérateur XOR (OU exclusif). Utilisez-le avec des valeurs boolean lorsqu’une seule condition doit être vraie, ou avec des entiers pour un XOR bit à bit. Ce n’est pas un opérateur d’exponentiation : Java ne possède pas d’opérateur **. La spécification du langage Java définit ces deux formes de ^.
Choisissez la forme booléenne pour les conditions et la forme entière pour les bits ou masques. Les exemples ont été exécutés avec OpenJDK 17.0.20.1; la préparation a consulté les informations de version actuelles de JDK 26.
Utiliser XOR avec des valeurs booléennes
Avec deux opérandes booléens, XOR vaut true seulement s’ils diffèrent. Sa table de vérité est simple:
| Gauche | Droite | left ^ right |
|---|---|---|
false |
false |
false |
false |
true |
true |
true |
false |
true |
true |
true |
false |
Contrairement à && et ||, ^ évalue les deux opérandes. Ne l’utilisez pas à la place d’une garde à court-circuit telle que value != null && value.isReady() : l’appel de méthode est quand même évalué. Employez-le lorsque les deux expressions booléennes peuvent être évaluées sans risque et que la règle est « exactement une ».
Cet exemple testé montre à la fois un XOR booléen et un XOR entier:
public class BooleanAndIntegerXor {
public static void main(String[] args) {
System.out.println(true ^ false);
System.out.println(true ^ true);
System.out.println(0b1100 ^ 0b1010);
}
}
Sortie:
true
false
6
Les deux premières lignes montrent la règle booléenne. Pour les entiers, 0b1100 ^ 0b1010 produit 0b0110, soit 6 en décimal : chaque bit obtenu vaut 1 seulement là où les bits d’entrée diffèrent.
Utiliser XOR avec des entiers et des masques
La forme bit à bit accepte byte, short, char, int et long. Java applique la promotion numérique binaire avant l’opération; les expressions avec de petits types entiers donnent donc souvent un résultat int. float et double ne peuvent pas être des opérandes XOR. Ne convertissez que si le type cible l’exige réellement, car un cast peut perdre des bits.
XOR permet de basculer des bits sélectionnés. Si flags est un entier et mask identifie les bits à modifier, flags ^ mask inverse exactement ces bits. Appliquer le même masque une seconde fois restaure les bits initiaux, car x ^ y ^ y vaut x. Cette propriété réversible aide à manipuler des bits de façon contrôlée, mais ne remplace pas une logique applicative plus claire.
Trouver une valeur sans paire
Un usage concis du XOR entier trouve une valeur lorsque toutes les autres apparaissent exactement deux fois. Les valeurs égales s’annulent, car x ^ x vaut 0 et 0 ^ x vaut x.
public class UniqueNumberXor {
public static void main(String[] args) {
int unique = 0;
for (int value : new int[] {4, 9, 4}) {
unique ^= value;
}
System.out.println(unique);
}
}
Sortie:
9
Cette technique dépend de conditions précises; ce n’est pas un algorithme général pour trouver un nombre unique. Elle fonctionne seulement si une valeur est non appariée et si toutes les autres apparaissent exactement deux fois. Elle ne trouve pas une valeur unique lorsqu’une autre apparaît trois fois. Choisissez un comptage si la règle d’occurrence diffère ou si vous avez aussi besoin des fréquences.
Préférer des alternatives claires quand elles conviennent
Utilisez != pour comparer l’inégalité de deux valeurs booléennes : l’intention peut être plus explicite qu’avec ^. Utilisez & 1 pour tester la parité d’un entier; la parité est une opération AND, pas XOR. L’échange de deux variables par XOR est une astuce connue, mais une variable temporaire ou une affectation normale est plus claire en Java et évite les erreurs d’alias.
La distinction essentielle est simple : ^ signifie OU exclusif pour les valeurs boolean et XOR bit à bit pour les entiers. Vérifiez les types des opérandes, rappelez-vous que les deux côtés booléens sont évalués, et énoncez les hypothèses sur les données avant de compter sur l’annulation des doublons.