a c, d; // a - арифметический тип
...
с = с + d;
d = с - d;
с = с - d;
Вариант без использования дополнительной переменной:
Пусть нужно обменять a и b (a, b - арифметический тип)
a += b;
b = a - b;
a -= b;
Вариант с операцией исключающего или (XOR) (Делать по области памяти)
a c, d; // a - целый тип, или юзать reinterpret_cast
...
c ^= d;
d ^= c;
c ^= d;
В ассемблере Intel- AMD- совместимых процессоров есть комманда XCHG, меняющая значения своих операндов.
XCHG c, d
Примечание: "Инструкция 'XCHG регистр, [память]' опасна. По умолчанию эта инструкция имеет неявный префикс LOCK, что не дает ей загружаться в кэш. Поэтому выполнение данной инструкции отнимает очень много времени, и ее следует избегать."
(C) Агнер Фог, пер. Aquila - Оптимизация для процессоров семейства Pentium источник: http://wasm.ru/article.php?article=1010027
Kloun > 4mlr > > А разве это не одно и тоже написано? > xDD )))) ну очевидно же что да! )))) там с d, а тут a b
А зачем тогда в статье два раза одно и тоже писать? щ_Щ
NULL_PTR > Это faq
действительно... а по смыслу подсказка.... я чет такими вопросами не задовался ни разу, и чудиться мне что на "часто задоваемый" этот вопрос не тянет.
реализуя предложенные вами алгоритмы обмена двух чисел без доп переменной
на языке turbo pascal 7.0 и в дальнейшем в отладчике td.exe обнаружил примерно следующие два кода (два алгоритма) (в фигурных скобках мои комментарии)
то есть на низком уровне происходит использование до двух регистров и по мере их затирания, они восстанавливаются из операндов памяти, а это уже нарушение условий задачи
я сомневаюсь, что другие компиляторы делают по другому
более того неплохо бы разобраться в работе команд процессора изнутри, на уровне элементарных логических функций.
вот например команда процессора сложить
add ax, bx {ax:=ax+bx}
при этом в самом ли деле процесс сложения связан с процессом плавного затирания уже не используемых битов регистра ax?
или все таки с использованием дополнительного скрытого от всех регистра?
единственное что работает прекрасно это ..
mov ax, [0001]
mov dx, [0002]
xchg ax, dx
Я раньше использовал вариант с XOR, но оказалось, он работает медленнее, чем с временной переменной. Лучше использовать временную переменную. Другие варианты не пробовал, но думаю, что будет ещё дольше. Я думаю, что в этих вариантах нет смысла: они делают код непонятным и замедляют программу.
Alex the.. > единственное что работает прекрасно это ..
Это обмен значений двух регистров, а не двух переменных ЯВУ. Ну и приводить результаты какого-то конкретного компилятора это кхм, приводи тогда уж сразу результаты 5-6 компиляторов.
Вот прицепились к этому ксору. Его учат на информатике в школе потому что через него можно реализовать какую-то операцию *в железе*, не используя никаких лишних битов под буфер. В программировании использовать - ни малейшего смысла.