Лучший способ поменять два числа без использования временного хранилища или арифметических операций - это загрузить обе переменные в регистры, а затем использовать регистры наоборот!
Вы не можете сделать это непосредственно из C, но компилятор, вероятно, вполне способен решить это за вас (по крайней мере, если оптимизация включена) - если вы пишете простой, очевидный код, такой как тот, который предложил KennyTM в своем комментарии.
, например
void swap_tmp(unsigned int *p)
{
unsigned int tmp;
tmp = p[0];
p[0] = p[1];
p[1] = tmp;
}
, скомпилированный с gcc 4.3.2 с флагом оптимизации -O2
, дает:
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)