L'opération XOR peut atteindre l'objectif d'échanger deux nombres, le code est le suivant :

void swap(int &a, int &b)
{
    a = a^b;
    b = a^b;
    a = a^b;
}

Mais cette méthode n'est pas recommandée,et voici une explication comparative avec la méthode courante de la variable temporaire.

Méthode de la variable temporaire :

void swap(int &a, int &b)
{
    int tmp = a;
    a = b;
    b = tmp;
}

Pour la méthode de la variable temporaire, chaque affectation ne nécessite que de lire la valeur d'une variable dans un registre, puis de la réécrire depuis le registre vers une autre variable, ce qui implique deux opérations d'écriture en mémoire au total. Cependant, pour l'opération XOR, il est nécessaire à chaque fois de lire deux données dans des registres, puis d'effectuer l'opération, et enfin de réécrire le résultat dans la variable, ce qui nécessite trois opérations d'écriture en mémoire au total. De plus, la lisibilité du code de l'opération XOR est médiocre.

Si vous utilisez le langage C pour implémenter les deux méthodes ci-dessus et les compiler avec le compilateur gcc, vous pouvez utiliser la commande gcc -S swap.cpour visualiser le code assembleur correspondant. La méthode de la variable temporaire a moins de lignes de code. De plus, lors de l'utilisation dugcccompilateur, l'échange de tableaux avec l'opération XOR provoquera des erreurs, voir le lien.

Sans introduire de variable temporaire, vous pouvez également utiliser trois opérations d'addition/soustraction pour échanger les valeurs de deux nombres, le code est le suivant :

void swap(int &a, int &b)
{
    a = a + b;
    b = a - b;
    a = a - b;
}

Cette méthode nécessite également trois opérations d'écriture en mémoire, et la lisibilité du code est également médiocre.

Enfin, ci-joint deux diagrammes de comparaison du code assembleur correspondant après compilation des trois méthodes (plateforme :Ubuntu14.04,gcc 4.8.4), dans les figuresswap1.cle fichier correspond à la méthode de la variable temporaire,swap2.cle fichier correspond à la méthode d'addition/soustraction,swap3.cle fichier correspond à la méthode XOR. On constate que la méthode de la variable temporaire se compile en le moins de code assembleur, ce qui signifie une efficacité supérieure. La différence entre la méthode d'addition/soustraction et la méthode XOR ne réside que dans la méthode de calcul ; les étapes d'opération sont identiques.

Figure 1 : Comparaison du code assembleur entre la méthode de la variable temporaire et la méthode d'addition/soustraction. Cliquez sur l'image pour voir une version agrandie.

Figure 2 : Comparaison du code assembleur entre la méthode XOR et la méthode d'addition/soustraction. Cliquez sur l'image pour voir une version agrandie.

Adresse d'origine : https://tangxuan1023.github.io/2018/02/09/%E4%BA%A4%E6%8D%A2%E4%B8%A4%E6%95%B0%E7%9A%84%E5%80%BC/#more