Банальный 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
  Откопано в архивах, написано хз когда.