SoloCodigo

Programación General => C/C++ => Mensaje iniciado por: Gossard en Miércoles 29 de Enero de 2003, 10:44

Título: Re: Swapping sin variables temporales
Publicado por: Gossard en Miércoles 29 de Enero de 2003, 10:44
Antes de nada un saludo a todos, soy nuevo en este foro y espero aprender mucho con vosotros.

Tengo una duda existencial:P : Hace poco me retaron a averiguar como se podia hacer intercambio de variables en C sin utilizar una intermedia o temporal.

La verdad es que no supe resolverlo:( .. asi que tras darme por vencido me dieron el codigo para hacerlo:

int a = 10, b = 20;
a ^= b ^= a ^= b;
printf( "a : %d, b : %dn", a, b );

A sale 20 y b 10:o

Mi pregunta es: alguine me pude destripar la linea de codigo a ^= b ^= a ^= b; ???? .. veo que eleva "a" a si mismo y lo asigna a b, lo mismo al reves y finalmente otra vez a b ... lo he hecho manualmente en papel con valores imaginarios y ni de lejos veo que se realize el intercambio...

Segin cuenta mi "retador" el swapping realmente existe, pero lo hace el compilador de manera implicita ...

Alguien me ayuda?

Mil gracias.
Título: Re: Swapping sin variables temporales
Publicado por: gmantil en Miércoles 29 de Enero de 2003, 14:20
Hola Gossard:
Lo que te han enviado no es una elevación a una potencia.

La asignación
 a ^= b ^= a ^= b;

está calculando un XOR entre bit de la variables, en este caso se calcula de derecha a izquierda, luego primero hace el XOR entre a y b y el resultado lo almacena en a. Este último hace se XOR con b y el resultado se almacena en b y por último el resultado de b se hace XOR con a y el resultado se almacena en a.

a=01010     => 10
b=10100     => 20
-------------
a=11110
b=10100    XOR
-------------
b=01010    => 10
a=11110    XOR
-------------
a=10100    => 20

Tener en cuenta que a ^= b;
es equivalente a tener a = a ^ b;

Suerte
gmantil
Título: Swapping sin variables temporales
Publicado por: hzigma en Martes 11 de Febrero de 2003, 15:31
No se pero me parece que es mas facil hacer la siguiente rutina:

int a=10, b=20;
a=a+b;
b=a-b;
a=a-b;

y listo queda resuelto sin tantas cosas y sencillo