SoloCodigo
Programación General => C/C++ => Mensaje iniciado 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.
-
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
-
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