Банальный xchg
==============
Итак,думая чем бы занять себя на ближайшие несколько часов (т.к. все это время мне надо было ждать одного нехорошего
человека), я вспоминал разные интересные задачи по информатике,которые добрые преподаватели подкидывали своим голодным
до знаний студентам. Но все уже давно было решено и изучено, перепроверено и улучшено. Ничего хорошего в голову не
приходило, а сидеть просто так без дела - не очень благородное занятие. Так сказать, трата свободного времени, блин. И
вот в горьких раздумьях вспомнилась мне одна вещь. Как-то раз однокурсник задал мне такой вопрос (я в это время писал
какую-то хрень на Java на паре информатики): "Вот у тебя даны две переменные, забитые разными значениями. И каким
способом ты хочешь поменять эти значения местами, т.е. чтобы значение в переменной А стало значением переменной Б и
наоборот"? Тупой вопрос конечно, да и стандартный способ есть. Берешь дополнительную темповую переменную, да спокойно
меняешь местами. "А слабо без этой переменной? А то ведь память дополнительная ... не прикольно". И вот что-то меня в
этом всем задело за живое. А ведь правда, вроде как и на асме пишу, там,за каждый байтик беспокоиться приходится,а тут
что - раз язык высокого уровня, так и про все забыть сразу можно? Пофигу: +5МБ или -5МБ? Неееет, подумал я и стал
упорно рассуждать как же все-таки это осуществить.
Так к чему это все? Да просто в то самое свободное время я смог выдумать 4 способа такой замены :) Что и представляю
на ваш суд. Как оказалось - все очень просто и мило получается. Главное понять саму суть проблемы, а найти решение
довольно легко.
Итак, 4 способа обмена значениями. Пусть нам дана переменная X = 3 и переменная Y = 2 (после "//" - комментарий)
1) Операция сложения
x = x + y; // x = 5; y = 2
y = x - y; // x = 5; y = 3
x = x - y; // x = 2; y = 3
2) Операция умножения
x = x * y; // x = 6; y = 2
y = x / y; // x = 6; y = 3
x = x / y; // x = 2; y = 3
3) Операция деления
if ( (y != 0) && (x != 0) ){
x = x / y; // x = 1.5; y = 2
y = x * y; // x = 1.5; y = 3
x = y / x; // x = 2; y = 3
}
4) Операция вычитания
if (x > y){ // !! x = 3; y = 2
x = x - y; // x = 1; y = 2
y = x + y; // x = 1; y = 3
x = y - x; // x = 2; y = 3
}
if (x < y){ // !! x = 2; y = 3
x = y - x; // x = 1; y = 3
y = y - x; // x = 1; y = 2
x = x + y; // x = 3; y = 2
}
Как легко заметить: самый подходящий и легкопонимаемый путь - сложение. Т.е. без всяких заморочек с проверками
условий и всякой другой ерундой, мы получаем хороший компактный код...
Я не утверждаю, что это самый оптимальный вариант. Возможно получатся и другие случаи.Но как я уже говорил - это для
языков высокого уровня. На асме же все решается путем банального xchg.
Да, забыл сказать. Такая вот задача была на какой-то олимпиаде по информатике для продвинутых блин программистов. Я
вот тоже удивился поначалу... а потом подумал: а может мы все и вправду такие умные? =)
dzen
Откопано в архивах, написано хз когда.