|
Intercambio Sin Variable Intermedia
Este algoritmo es tan sorprendente que a pesar
de no ser propio no he podido evitar ponerlo. La idea esta sacada
del libro "Graphics Gems, Andrew S. Glasnner". Consiste
en intercambiar el valor de dos variables sin usar una tercera
variable temporal. Para esto se usa el operador xor bit a bit.
Este operador al trabajar a nivel de bit permite que el intercambio
se realize sin importar el tipo de dato.
Este es el pseudocodigo:
a <= a xor b
b <= b xor a
a <= a xor b
La explicación1
tenemos que sacarla de las propiedades matematicas del operador
xor. Este es conmutativo y asociativo por lo que podemos desarrollar
las fórmulas de la siguiente manera.
Basicamente la demostración parte de las
ecuaciones del algoritmo y llega a lo que queremos lograr (el
intercambio de variables) usando las propiedades de xor (fórmulas
1 a 4).
Se puede ver en la demostración que se
usan 5 variable a, a' ,a'', b y b'. Se hace esto para que sea
la sintaxis correcta pero en la implementación se actualiza
sobre la misma variable ya que esta no se vuelve a usar.
Como ejemplo pongo la inplementacion del algoritmo
en C++ y ensamblador.
inline void swap(int &a,int &b){
a^=b;
b^=a;
a^=b;
}
|
mov eax, a
mov ecx, b
xor eax, ecx
xor ecx, eax
xor eax, ecx
mov a, eax
mov b, ecx
|
Y para los que todavia no se lo crean un ejemplo
de libro con a=5 y b=6.
|
Valor de a |
Valor de b |
|
5 |
6 |
a = a xor b (101 xor 110
= 011) |
3 |
6 |
b = b xor a (110 xor 011
= 101) |
3 |
5 |
a = a xor b (011 xor 101
= 110) |
6 |
5 |
Luis José Cabellos
|
1. La explicación de porque funciona si que
es mia
|