DevDoc home page DevDoc background gradient
 
   
Имя Пароль Запомнить Зарегистрироваться

Автор: Кудинов Александр
Последняя модификация: 2007-03-26 22:28:50

Обмен значений

Условие задачи

Требуется написать код для обмена значений двух переменных без создания временной копии.

Решение

Решение прислал 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);
}

Подпишитесь, чтобы получать все новые статьи с сайта первым!

Оценить статью Текущий рейтинг: 3.0238. Проголосовало 42 человек.

Коментарии к статье

a =a+b
b = a-b
a = a -b
и совсем ненужно делать таких сложных манипуляций. Вообще задачка с 8 класа :)
Решение, впринцыпе, тривиальное...

Вот только нужно использовать его с умом. так как от переполнения, и как следствие, потере данных, тут нет страховки.

попробуйте таким образом обменять два числа которые размещены в переменных с типом char. Получите массу удовольствия =)
Не советую так делать в серьезных программах
попробуйте xchg1(a, a, 8) и получите удовольствие

Добавить комментарий

Вы можете добавлять свои комментарии, пожелания или вопросы к статье. Они будут видны всем пользователям, а также автору статьи. Войдите в систему под своим именем, чтобы другие пользователи могли видеть, кто автор сообщения. Форма для входа расположена вверху страницы. Если у Вас нет аккаунта на сайте - рекомендуем зарегистрироваться. Это займет всего пару минут.

Отправлять сообщения могут только зарегистрированные пользователи

Copyright (C) Kudinov Alexander, 2006-2012

Перепечатка материалов с данного сайта запрещена без письменного разрешения автора. При перепечатке обязательно указывать ссылку на оригинал.

Generation time: 0,523528814316 seconds