Обмен значений двух переменных без использования буфера

{lang: 'ru'}

Это небольшая зарядка для ума, суть которой в следующем:

Нужно изменить всем известный код обмена значений двух переменных, типа

так, чтобы можно было обойтись без буферной переменной. Для простоты задачи предположим, что обменять нужно целочисленные переменные.

Те, кому лень думать самим, могут подсмотреть ответ чуть ниже, под картинкой. Но я бы рекомендовал попробовать догадаться без подсказки. Поэтому, пока вы думаете, можете полюбоваться на красивую картинку…

А теперь, барабанная дробь… Правильный ответ:


Для тех, кто не верит, приведу таблицу, в которой в соответствующих колонках будут отображены значение, хранимые в обоих переменных после каждой операции:

a b
a= a+b a+b b
b= a-b a+b a+b-b= a
a= a-b a+b-a= b a

В принципе, такой же способ можно использовать и для вещественных чисел. Однако, тут появляется одна проблема: потеря точности. Если нужно будет обменять местами очень малое значение с очень большим, то при a+b результат будет равен большему числу, т.к. малое относительно него будет приравнено к 0.

Для обмена значений вещественных переменных по той же схеме без риска потери точности можно использовать операцию «исключающего ИЛИ», или по-другому XOR. В С++ она обозначается «крышечкой» — ^. Т.е. итоговый код по обмену будет выглядеть так:

P.S.: Конечно, особого выигрыша от экономии нескольких байт памяти не будет, но, как было сказано выше, это неплохая зарядка для ума. И кто знает, вдруг и это когда-нибудь пригодится ;)


Полезная статья? Их будет больше, если вы поддержите меня!


  • Артём

    Занимательная статья :)
    Было бы интересно почитать побольше о таких задачках и не стандартных ситуациях и решениях их в С/С++

  • Rossky

    Спасибо :) Поищу в закромах еще что-нибудь подобное :)