PROJET AUTOBLOG


le hollandais volant

Site original : le hollandais volant

⇐ retour index

Mise à jour

Mise à jour de la base de données, veuillez patienter...

[Programmation] Inverser deux variables avec des XOR

lundi 5 novembre 2018 à 21: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 "1100 xor 1010", c’est à dire "0110"
b = b xor a
// b devient "b xor a" donc "1010 xor 0110" (la nouvelle valeur de a), soit "1100"
a = a xor b
// a devient "a xor b" donc "0110 xor 1100", soit "1010"


On a doncbien inversé les variables.

À noter que l'opération XOR ici est appliqué au niveau binaire, donc au plus bas niveau possible de l'ordinateur. Cela signifie que les variables sont inversées quelque soient le type de variables (nombres, lettres, images, tableaux de donnés...).
C'est donc plus puissant qu'une opération numérique sur des nombres.

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

Error happened! 0 - Undefined variable: xml In: /home/cochisebee/www/autoblog/autoblogs/autoblog.php:77 http://autoblog.cochi.se/autoblogs/lehollandaisvolantnet_f9e3899f52053c0dd7253d25ca504c7b4265953e/?Programmation-Inverser-deux-variables-avec-des-XOR #0 /home/cochisebee/www/autoblog/autoblogs/autoblog.php(77): exception_error_handler(8, 'Undefined varia...', '/home/cochisebe...', 77, Array) #1 /home/cochisebee/www/autoblog/autoblogs/autoblog.php(368): VroumVroum_Feed_Exception::getXMLErrorsAsString(Array) #2 /home/cochisebee/www/autoblog/autoblogs/autoblog.php(932): VroumVroum_Blog->update() #3 /home/cochisebee/www/autoblog/autoblogs/lehollandaisvolantnet_f9e3899f52053c0dd7253d25ca504c7b4265953e/index.php(1): require_once('/home/cochisebe...') #4 {main}