Quand deux conditions doivent produire un résultat vrai uniquement si une seule est active, l’opérateur XOR devient rapidement plus clair avec un tableau. Je présente ici sa table de vérité, la différence entre XOR logique et XOR bit à bit, ainsi que des exemples concrets en Python, JavaScript et C. Vous verrez aussi ses usages, ses limites et les erreurs qui provoquent le plus souvent un résultat inattendu.
L’essentiel pour comprendre et utiliser XOR correctement
- Une seule entrée vraie produit 1 avec XOR.
- Deux entrées identiques donnent toujours 0.
- En programmation, ^ désigne généralement le XOR bit à bit.
- La table comporte 4 combinaisons pour deux entrées binaires.
- XOR est utile pour la parité, les masques et le basculement d’états.
Lire une table XOR en un coup d’œil
XOR signifie OU exclusif. Le résultat vaut 1 lorsque exactement une des deux entrées vaut 1. Si les deux entrées sont à 0 ou toutes les deux à 1, le résultat vaut 0.
La table ci-dessous est parfois appelée xor table dans la documentation anglophone. Elle suffit à vérifier rapidement un calcul logique ou à comprendre le comportement d’un opérateur dans un programme.
| Entrée A | Entrée B | A XOR B | Interprétation |
|---|---|---|---|
| 0 | 0 | 0 | Aucune entrée active |
| 0 | 1 | 1 | Une seule entrée active |
| 1 | 0 | 1 | Une seule entrée active |
| 1 | 1 | 0 | Les deux entrées sont actives |
Le moyen le plus simple de retenir cette règle consiste à penser à une porte avec deux interrupteurs, mais une seule lampe autorisée à être active. Dès que les interrupteurs sont dans le même état, la sortie reste à 0.
Ne pas confondre XOR avec OR ou AND
La confusion entre XOR et OR est fréquente, surtout lorsque les conditions sont formulées en langage courant. OR accepte une, deux ou aucune entrée active, tandis que XOR refuse le cas où les deux entrées sont vraies simultanément.
| A | B | AND | OR | XOR | XNOR |
|---|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 | 1 |
| 0 | 1 | 0 | 1 | 1 | 0 |
| 1 | 0 | 0 | 1 | 1 | 0 |
| 1 | 1 | 1 | 1 | 0 | 1 |
J’utilise souvent la formulation suivante pour choisir le bon opérateur. AND signifie que tout doit être vrai, OR qu’au moins une condition suffit, et XOR qu’une seule condition doit être vraie. XNOR fait l’inverse de XOR et renvoie 1 lorsque les deux valeurs sont identiques.
La relation mathématique
XOR peut s’écrire avec les opérateurs classiques sous la forme (A OR B) AND NOT (A AND B). Une autre écriture équivalente est (A AND NOT B) OR (NOT A AND B). Ces formules sont utiles lorsqu’un langage ou un circuit ne propose pas directement d’opérateur XOR.
Passer de la logique aux opérations sur les bits
En programmation, XOR ne travaille pas toujours sur une simple valeur vraie ou fausse. Dans sa forme bit à bit, il compare chaque position binaire de deux nombres indépendamment. Le bit de sortie vaut 1 lorsque les deux bits comparés sont différents.
Prenons l’exemple de 5 et 3. En binaire, 5 s’écrit 0101 et 3 s’écrit 0011. La comparaison donne 0110, soit 6 en décimal.
0101
^ 0011
= 0110
Cette distinction compte beaucoup. Un XOR logique répond à une question de type vrai ou faux, alors qu’un XOR bit à bit transforme chaque bit d’un entier. Dans de nombreux langages, le symbole ^ correspond au second cas.
Écrire et tester XOR dans un programme
Python
Avec des booléens, Python permet d’exprimer directement le XOR avec l’opérateur !=, puisque deux valeurs booléennes sont différentes uniquement lorsqu’une seule est vraie. Pour des entiers, le symbole ^ réalise une opération bit à bit.
a = True
b = False
resultat_logique = a != b
resultat_bits = 5 ^ 3
print(resultat_logique) # True
print(resultat_bits) # 6
JavaScript
En JavaScript, ^ convertit ses opérandes en entiers signés sur 32 bits avant d’effectuer le calcul bit à bit. Pour tester exclusivement deux conditions, je préfère souvent écrire une comparaison explicite, car elle rend l’intention plus lisible.
const actifA = true;
const actifB = false;
const uneSeuleCondition = actifA !== actifB;
const resultatBits = 5 ^ 3;
console.log(uneSeuleCondition); // true
console.log(resultatBits); // 6
C et langages proches
En C, C++ et plusieurs langages de la même famille, ^ est l’opérateur XOR bit à bit. Il ne faut pas le confondre avec ||, qui représente le OR logique, ni avec ^^, qui n’est généralement pas un opérateur valide.
int a = 5;
int b = 3;
int resultat = a ^ b; /* resultat vaut 6 */
Pour vérifier une implémentation, je teste systématiquement les quatre combinaisons de la table de vérité. Ce petit test révèle rapidement une inversion de condition ou une confusion entre opérateurs logiques et bit à bit.
Les usages concrets de XOR en programmation
Vérifier une parité
Le XOR permet de calculer si un ensemble contient un nombre pair ou impair de valeurs à 1. En effet, chaque XOR supplémentaire inverse le résultat. Cette propriété est utilisée dans des contrôles de parité et certains mécanismes de vérification de données.
Cette méthode reste limitée. Une parité XOR peut détecter certaines erreurs, mais elle ne garantit pas qu’un message est intact et ne remplace jamais un contrôle d’intégrité adapté ou une authentification cryptographique.
Activer ou désactiver un bit
Avec un masque binaire, XOR permet de basculer un bit. Si le masque contient 1 à une position donnée, le bit correspondant change d’état. Si le masque contient 0, il reste inchangé.
etat = 0b0100
masque = 0b0010
nouvel_etat = etat ^ masque
# Résultat : 0b0110
C’est pratique pour gérer des options compactes, des permissions ou des indicateurs d’état. Il faut toutefois documenter les positions utilisées, car un masque mal choisi peut modifier plusieurs fonctionnalités en même temps.
Lire aussi : Art ASCII en programmation - Le guide complet pour des rendus parfaits
Comparer deux états
XOR permet aussi d’identifier les bits qui diffèrent entre deux nombres. L’opération a ^ b produit 1 exactement aux positions où les valeurs ne correspondent pas. Pour comparer des drapeaux ou repérer une modification dans une structure binaire, cette propriété est particulièrement efficace.
Les erreurs qui produisent un résultat inattendu
- Confondre XOR et OR lorsque le cas des deux conditions vraies doit être refusé.
- Utiliser ^ en pensant écrire un XOR logique dans un langage où il s’agit d’un opérateur bit à bit.
- Oublier que les nombres possèdent plusieurs bits et que le calcul s’effectue position par position.
- Employer des valeurs comme 2 ou 3 sans vérifier leur conversion en booléen dans le langage choisi.
- Utiliser XOR comme mécanisme de chiffrement sans comprendre ses limites et la gestion des clés.
Le dernier point mérite une attention particulière. XOR intervient dans certains algorithmes cryptographiques, mais appliquer un nombre à un message avec XOR ne suffit pas à créer une protection sûre. La sécurité dépend de la clé, de sa longueur, de son caractère aléatoire et de sa réutilisation.
Une méthode simple pour valider son raisonnement
Avant d’intégrer XOR dans une condition ou un masque, j’écris les entrées possibles dans un tableau, puis je vérifie un exemple numérique en binaire. Cette double vérification évite de se fier uniquement à l’intuition, qui confond facilement OU inclusif et OU exclusif.
- Déterminer si le problème porte sur des booléens ou sur des bits.
- Écrire les quatre cas lorsque deux entrées sont concernées.
- Calculer un exemple simple avec 0 et 1.
- Tester les valeurs limites dans le code.
- Ajouter un commentaire lorsque le symbole ^ n’est pas immédiatement évident.
Pour deux conditions, la règle est courte. Même valeur signifie 0, valeur différente signifie 1. Pour plusieurs opérandes, le résultat dépend du nombre de valeurs à 1, car chaque XOR inverse successivement la sortie.
Le bon réflexe avant d’utiliser XOR
Une table XOR n’est pas seulement un aide-mémoire. Elle permet de choisir le bon opérateur, de distinguer une condition logique d’un traitement binaire et de repérer les erreurs avant qu’elles ne deviennent difficiles à diagnostiquer.
Dans la pratique, je retiens surtout ceci. XOR convient lorsque le résultat doit signaler une différence ou autoriser une seule option parmi deux. Dès que plusieurs états, des conversions implicites ou des exigences de sécurité entrent en jeu, il faut compléter la table par des tests ciblés et une documentation claire.