Обмен значений
Условие задачи
Требуется написать код для обмена значений двух переменных без создания временной
копии.
Решение
Решение прислал Mr. Wanderer:
// Вообще-то типы обмениваемых переменных не указаны,
// так что придется в общем виде -
// xchg(unsigned char * a, unsigned char * b, int len);
// Компилятор - Open Watcom C++
#include <stdio.h>
#pragma aux varxchg = \
"cc: " \
"mov al,[esi]" \
"xchg al,[edi]" \
"mov [esi],al" \
"inc esi" \
"inc edi" \
"loop cc" \
parm [esi][edi][ecx] \
modify[eax];
void __pragma("varxchg") xchg(unsigned char * a, unsigned char * b, int len);
// Формально в этой функции не создается ни одна переменная :)
прим. DevDoc: Функция использует дополнительный регистр, поэтому
с алгоритмической точки зрение решение не верное. С другой стороны любой алгоритм
обмена на C++ повлечет использование регистров после компиляции.
// Обходимся без переменных (переменная цикла не в счет :),
// это аргумент функции)
void xchg1(unsigned char * a, unsigned char * b, int len)
{
for(--len;len>=0;--len)
{
a[len]^=b[len];
b[len]^=a[len];
a[len]^=b[len];
}
}
// Тоскливо - зависит от реализации сложения и вычитания,
// может и не сработать
void xchg2(unsigned char * a, unsigned char * b, int len)
{
for(--len;len>=0;--len)
{
a[len]+=b[len];
b[len] = a[len] - b[len];
a[len]-=b[len];
}
}
// Словом, если есть операторы @ и $ такие, что a@b$b = a, то
// a = a@b
// b = a$b
// a = a$b
void main()
{
unsigned char * a = "abcdefgh";
unsigned char * b = "ijklmnop";
printf("%s %s\n",a,b);
xchg(a,b,8);
printf("%s %s\n",a,b);
xchg1(a,b,8);
printf("%s %s\n",a,b);
xchg2(a,b,8);
printf("%s %s\n",a,b);
}
Коментарии к статье|
a =a+b
b = a-b
a = a -b | |
| и совсем ненужно делать таких сложных манипуляций. Вообще задачка с 8 класа :) | |
Решение, впринцыпе, тривиальное...
Вот только нужно использовать его с умом. так как от переполнения, и как следствие, потере данных, тут нет страховки.
попробуйте таким образом обменять два числа которые размещены в переменных с типом char. Получите массу удовольствия =) | |
Не советую так делать в серьезных программах
попробуйте xchg1(a, a, 8) и получите удовольствие |
|