La plupart des gens permuter deux variables x et y à l'aide d'une variable temporaire, comme ceci:
tmp = x
x = y
y = tmp
Voici un joli programmation astuce pour échanger deux valeurs sans avoir besoin d'un temp:
x = x xor y
y = x xor y
x = x xor y
Plus de détails dans Permuter deux variables à l'aide de XOR
Sur la ligne 1, nous combinons x et y (en utilisant XOR) pour bénéficier de cet "hybride" et nous l'enregistrons de retour dans x. XOR est une excellente façon d'économiser de l'information, parce que vous pouvez le supprimer en faisant un XOR de nouveau.
Sur la ligne 2. Nous XOR l'hybride avec y, qui annule tous les y des informations, nous laissant seuls avec x. Nous sauver ce résultat dans y, alors maintenant, ils ont échangé.
Sur la dernière ligne, x a encore de l'hybride valeur. Nous XOR encore avec y (avec x la valeur de l'achat) pour supprimer toutes les traces de x de l'hybride. Ce qui nous laisse avec y, et le swap est terminé!
L'ordinateur dispose d'un implicite "temp" de la variable qui stocke les résultats intermédiaires avant d'écrire de nouveau à un registre. Par exemple, si vous ajoutez 3 à un registre (en langage machine) pseudo-code):
ADD 3 A // add 3 to register A
L'ALU (Unité Arithmétique et Logique) est en fait ce qu'exécute l'instruction 3+R. Il faut entrées (3,A) et crée un résultat (3 + A), le PROCESSEUR stocke ensuite de retour dans Un original du registre. Ainsi, nous avons utilisé l'ALU comme temporaire de l'espace de travail avant d'avoir la réponse finale.
Nous prenons l'ALU implicite de données temporaires pour acquis, mais il est toujours là. De manière similaire, l'ALU peut retourner le résultat intermédiaire de la XOR dans le cas de x = x xor y, à quel point le PROCESSEUR stocke dans x de caisse original.
Parce que nous ne sommes pas habitués à réfléchir sur les pauvres, négligées ALU, le XOR swap semble magique car il n'a pas explicitement la variable temporaire. Certaines machines ont un 1-l'étape d'échange d'instruction XCHG pour permuter les deux registres.