« 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==
|