Обмен значений переменных. (комментарии)
Это сообщение сгенерировано автоматически.
Вариант с суммой:
a c, d; // a - арифметический тип
...
с = с + d;
d = с - d;
с = с - d;
Вариант без использования дополнительной переменной:
Пусть нужно обменять a и b (a, b - арифметический тип)
a += b;
b = a - b;
a -= b;
А разве это не одно и тоже написано?
4mlr
> А разве это не одно и тоже написано?
xDD )))) ну очевидно же что да! )))) там с d, а тут a b
Kloun
> 4mlr
> > А разве это не одно и тоже написано?
> xDD )))) ну очевидно же что да! )))) там с d, а тут a b
А зачем тогда в статье два раза одно и тоже писать? щ_Щ
4mlr
как зачем? чтобы больше вариантов было! а то былаб подсказкочка коротенькая.
Kloun
> а то былаб подсказкочка коротенькая.
Это faq.
NULL_PTR
> Это faq
действительно... а по смыслу подсказка.... я чет такими вопросами не задовался ни разу, и чудиться мне что на "часто задоваемый" этот вопрос не тянет.
a:=a xor b;
b:=a xor b;
a:=a xor b;
Для a != 0 и b != 0:
a = a * b; b = a / b; a = a / b;
Для a > 0 и b > 0:
a = power(a, b); b = power(a, 1/b); a = log(a, b);
=D
реализуя предложенные вами алгоритмы обмена двух чисел без доп переменной
на языке turbo pascal 7.0 и в дальнейшем в отладчике td.exe обнаружил примерно следующие два кода (два алгоритма) (в фигурных скобках мои комментарии)
{a:=a+b}
mov bx, [0053]
mov ax, [0052]
add ax, bx
{b:=a-b}
sub ax,bx
mov [0053],ax
{a:=a-b}
mov ax, [0052]
sub ax, bx
mov [0052], ax
-----------------------------------------------------------------
{a : = a xor b}
mov al, [0001]
xor al, [0002]
mov [0001], al
{b : = a xor b}
mov al, [0002]
mov [0002],al
{a : =a xor b}
mov al,[0001]
xor al, [0002]
mov [0001],al
то есть на низком уровне происходит использование до двух регистров и по мере их затирания, они восстанавливаются из операндов памяти, а это уже нарушение условий задачи
я сомневаюсь, что другие компиляторы делают по другому
более того неплохо бы разобраться в работе команд процессора изнутри, на уровне элементарных логических функций.
вот например команда процессора сложить
add ax, bx {ax:=ax+bx}
при этом в самом ли деле процесс сложения связан с процессом плавного затирания уже не используемых битов регистра ax?
или все таки с использованием дополнительного скрытого от всех регистра?
единственное что работает прекрасно это ..
mov ax, [0001]
mov dx, [0002]
xchg ax, dx
всего в два- четыре такта и три строки
std::swap и пофик)
Я раньше использовал вариант с XOR, но оказалось, он работает медленнее, чем с временной переменной. Лучше использовать временную переменную. Другие варианты не пробовал, но думаю, что будет ещё дольше. Я думаю, что в этих вариантах нет смысла: они делают код непонятным и замедляют программу.
Alex the..
> единственное что работает прекрасно это ..
Это обмен значений двух регистров, а не двух переменных ЯВУ. Ну и приводить результаты какого-то конкретного компилятора это кхм, приводи тогда уж сразу результаты 5-6 компиляторов.
>KpeHDeJIb
>приводи тогда уж сразу результаты 5-6 компиляторов.
назовите какой нибудь низкоуровневый компилятор, код которого бы не восстанавливал значения регистров из памяти в процессе работы
все может быть, ..
, но паскалевский считался когда то эталонным
и с тех пор компиляторы только разжирели
да и вопрос тут ставиться, возможно ли это в принципе?
и каков механизм внутренней работы низкоуровневых команд процессора?
Вот прицепились к этому ксору. Его учат на информатике в школе потому что через него можно реализовать какую-то операцию *в железе*, не используя никаких лишних битов под буфер. В программировании использовать - ни малейшего смысла.
Тема в архиве.