• Viernes 17 de Mayo de 2024, 03:44

Autor Tema:  Re: Swapping sin variables temporales  (Leído 1091 veces)

Gossard

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
Re: Swapping sin variables temporales
« en: Miércoles 29 de Enero de 2003, 10:44 »
0
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.

gmantil

  • Miembro MUY activo
  • ***
  • Mensajes: 121
    • Ver Perfil
Re: Swapping sin variables temporales
« Respuesta #1 en: Miércoles 29 de Enero de 2003, 14:20 »
0
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

hzigma

  • Miembro activo
  • **
  • Mensajes: 30
    • Ver Perfil
Swapping sin variables temporales
« Respuesta #2 en: Martes 11 de Febrero de 2003, 15:31 »
0
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