La mejor manera de intercambiar dos números sin el uso de cualquier sistema de almacenamiento temporal o operaciones aritméticas es cargar ambas variables en registros, y luego utilizar los registros al revés!
No puede hacer eso directamente desde C, pero el compilador probablemente sea bastante capaz de resolverlo (al menos, si la optimización está habilitada) - si escribe código simple y obvio, como el que KennyTM sugerido en su comentario.
p. Ej.
void swap_tmp(unsigned int *p)
{
unsigned int tmp;
tmp = p[0];
p[0] = p[1];
p[1] = tmp;
}
compilado con gcc 4.3.2 con la bandera -O2
optimización da:
swap_tmp:
pushl %ebp ; (prologue)
movl %esp, %ebp ; (prologue)
movl 8(%ebp), %eax ; EAX = p
movl (%eax), %ecx ; ECX = p[0]
movl 4(%eax), %edx ; EDX = p[1]
movl %ecx, 4(%eax) ; p[1] = ECX
movl %edx, (%eax) ; p[0] = EDX
popl %ebp ; (epilogue)
ret ; (epilogue)
'c = a; a = b; b = c?'; – kennytm
¿Por qué querrías hacer esto? –
lee esto en 1 libro ... eso es y. cómo intercambiar sin operadores aritméticos –