PROJET AUTOBLOG


Le Hollandais Volant

source: Le Hollandais Volant

⇐ retour index

[Programmation] Inverser deux variables avec des XOR

lundi 5 novembre 2018 à 22:10

i
Voir :

On peut inverser deux variables sans utiliser de variables intermédiaires. Généralement c’est fait avec deux additions et une soustraction. Mais on peut aussi utiliser 3 "XOR" de suite. Ce lien tente d’expliquer ça de façon visuelle.

Je connaissais l’astuce, mais je ne trouve pas ça très parlant : les images ne sont pas expliquées.
Je pense que je préfère la version avec les bit, que j’explique ci-dessous :

Pour rappel, le XOR est la contraction de « x-or » ou « eXclusive-or », soit le ou-exclusif en français.

Il s’agit d’une opération qui prend deux entrées et offre une sortie : la sortie est à 1 si l’une des entrées seulement est à 1. Dans les autres cas, c’est 0.

Donc, prenant le format A xor B = C :

0 xor 0 = 0 // il n’y a aucun 1, donc le résultat est 0.
0 xor 1 = 1 // il y a un 1 et un seul, donc le résultat est 1.
1 xor 0 = 1 // il y a un 1 et un seul, donc le résultat est 1.
1 xor 1 = 0 // il y a deux 1, donc le résultat est 0.


Donc si je fais ça pour une chaîne binaire entière, en appliquant ça chiffre à chiffre :

    1 1 0 0
xor 1 0 1 0
    ↓ ↓ ↓ ↓
    0 1 1 0


Autrement dit : 1100 xor 1010, ça fait : 0110.

Maintenant, il se trouve qu’on peut utiliser ça pour inverser deux variables, a et b :

var a = 1100
var b = 1010


On veut inverser les deux variables (attribuer à b la valeur de a et à a la valeur de b). Généralement on utilise une variable « jetable » intermédiaire :
var a = 1100
var b = 1010
// Puis on fait :
var c = a 
a = b
b = c

// ici donc on a a=1010 et b=1100, donc le résultat voulu.

On a temporairement donné la valeur de a à c pour ne pas perdre cette valeur.


Pour obtenir ça avec des xor, ça se fait en 3 étapes :

var a = 1100
var b = 1010

a = a xor b
b = b xor a
a = a xor b

// maintenant on a a=1010 et b=1100


Si j’explicite avec les valeurs numériques :

var a = 1100
var b = 1010

a = a xor b
// a devient "a xor b", donc "1010 xor 1100", c’est à dire "0110"
b = b xor a
// b devient "b xor a" donc "1100 xor 0110" (la nouvelle valeur de a), soit "1010"
a = a xor b
// a devient "a xor b" donc "0110 xor 1010", soit "1100"


Pour plus de détails sur le binaire, voir mon cours :

Et pour plus de détails sur l’usage du binaire en informatique, les semi-conducteurs, et comment un tas de transistors peut calculer :

image d’en-tête de Patrick