Это небольшая зарядка для ума, суть которой в следующем:
Нужно изменить всем известный код обмена значений двух переменных, типа
1 2 3 4 |
int a,b; int buf=a; a=b; b=buf; |
так, чтобы можно было обойтись без буферной переменной. Для простоты задачи предположим, что обменять нужно целочисленные переменные.
Те, кому лень думать самим, могут подсмотреть ответ чуть ниже, под картинкой. Но я бы рекомендовал попробовать догадаться без подсказки. Поэтому, пока вы думаете, можете полюбоваться на красивую картинку…
А теперь, барабанная дробь… Правильный ответ:
1 2 3 4 |
int a,b; a = a + b; b = a - b; a = a - b; |
Для тех, кто не верит, приведу таблицу, в которой в соответствующих колонках будут отображены значение, хранимые в обоих переменных после каждой операции:
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. В С++ она обозначается «крышечкой» — ^. Т.е. итоговый код по обмену будет выглядеть так:
1 2 3 4 |
int a,b; a = a ^ b; b = a ^ b; a = a ^ b;< |
P.S.: Конечно, особого выигрыша от экономии нескольких байт памяти не будет, но, как было сказано выше, это неплохая зарядка для ума. И кто знает, вдруг и это когда-нибудь пригодится ;)
Полезная статья? Их будет больше, если вы поддержите меня!