« Les opérations bit à bit/Les subtilités du XOR » : différence entre les versions

Contenu supprimé Contenu ajouté
mAucun résumé des modifications
Ligne 5 :
Pour commencer, nous allons regarder ce qui se passe lorsque l'on XOR un bit avec lui-même. Nous avons vu dans le premier chapitre que <math>a \oplus a = 0</math>. Si cela vaut pour un bit, cela s'applique aussi quand on effectue un XOR bit à bit sur un nombre : chacun de ses bits sera donc XORé avec lui-même, et sera donc mis à zéro. Conséquence : un nombre XOR lui-même donnera toujours zéro. Cette propriété est utilisé en assembleur pour mettre à zéro un registre. D'ordinaire, on met un registre à zéro en utilisant une instruction qui charge une constante (ici zéro) dans un registre. Seul problème : cette constante peut parfois être intégrée directement dans la suite de bits de l'instruction, si celle-ci peut utiliser le mode d'adressage immédiat. Dans ce cas, une dizaine de bits est utilisée pour stocker la constante. En comparaison, une instruction XOR entre deux registres n'aura pas besoin d’intégrer de constante à coté de son opcode, et prendra moins de place. Sur d'autres processeurs, la constante est lue depuis la mémoire. En comparaison, un XOR entre deux registres ne va rien charger en RAM et est donc plus rapide.
 
==Echange de deux variables==
==Stupid XOR trick==
 
Si je vous demande d'échanger le contenu de deux entiers a et b, vous allez certainement écrire un code similaire à celui-ci :
Une autre astuce assez intéréssante de l'instruction XOR est connue sous le nom de '''stupid XOR trick''' chez nos amis anglo-saxons. Celui-ci permet d'échanger les valeurs de deux registres/variables, sans utiliser de registre/variable temporaire Il est en effet possible d'échanger le contenu de deux registres/variables A et B en effectuant les opérations suivante, dans l'ordre :
 
<source lang="c">
int t = a ;
a = b ;
b = t ;
</source>
 
Mais il est possible d'échanger les valeurs de deux registres/variables, sans utiliser de registre/variable temporaire ! Pour cela, il existe différentes méthodes assez simple.
 
===Stupid XOR trick===
 
UneLa autrepremière astuceméthode assezse intéréssantebase sur les particularités de l'instruction XOR et est connue sous le nom de '''stupid XOR trick''' chez nos amis anglo-saxons. Celui-ci permet d'échanger les valeurs de deux registres/variables, sans utiliser de registre/variable temporaire Il est en effet possible d'échanger le contenu de deux registres/variables A et B en effectuant les opérations suivante, dans l'ordre :
 
* <math>A = A \oplus B</math> ;