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

Contenu supprimé Contenu ajouté
→‎Mise à zéro rapide : Genre : UN processeur + un seul "que" suffit
→‎Échange de deux variables : Attention avec les pointeurs
Ligne 106 :
 
<source lang="c">
x ^= y ^= x ^= y ;
</source>
 
Ligne 189 :
 
Comme on le voit, nos données ont bien étés inversées.
 
=== Piège avec les pointeurs ===
 
Il faut faire attention au cas où des pointeurs sont utilisés pour adresser indirectement les variables à échanger, par exemple si une fonction est créée pour procéder à l'échange, comme celle-ci :
<source lang="c">
void exchangeIntegers(int* px, int* py)
{
*px ^= *py ^= *px ^= *py ;
}
</source>
 
Dans le cas où l'on passe deux adresses différentes, aucun problème ne se produit :
<source lang="c">
int a = 5;
int b = 10;
exchangeIntegers(&a, &b);
</source>
 
Dans le cas où l'on passe deux adresses identiques, la variable pointée est remise à zéro (a XOR a) :
<source lang="c">
int a = 5;
exchangeIntegers(&a, &a);
</source>
 
Ce n'est pas l'effet voulu par la fonction. Il faut donc soit utiliser la technique de la variable intermédiaire qui n'a pas ce problème, soit vérifier les adresses passées en paramètres.
<source lang="c">
void exchangeIntegers(int* px, int* py)
{
if (px != py) *px ^= *py ^= *px ^= *py ;
}
</source>
 
==Listes chainées XOR==