Обмен значениями переменных x
и y
обычно выполняется так:
tmp = x;
x = y;
y = tmp;
Избежать использования дополнительной переменной можно, используя для обмена значениями операцию XOR (Исключающее ИЛИ):
x = x ^ y;
y = y ^ x;
x = x ^ y;
Рассмотрим как это работает. Пусть x = 1010
, y = 0110
. Тогда:
x = 1010
y = 0110
x ^ y = 1100 // "новый" x
В результате выполнения первого XOR-а единичными остаются те биты, в которых x
и y
отличались. Другими словами, в "новом" x
сохраняется все то, что отличало начальные x
и y
.
После следующего шага
y = 0110
x = 1100
x ^ y = 1010 // "новый" y равен начальному x
из начального значения y
исключается все, что отличало y
от x
. В итоге остается только x
(каким он был до начала обмена).
Аналогично,
x = 1100
y = 1010
x ^ y = 0110 // "новый" x равен начальному y
из начального x
(теперь это y
) исключается все, что отличало его от y
. Результат получается равным начальному значению y
.
А теперь все вместе
x = x ^ y; // то, что отличает начальные x и y
y = y ^ x; // "новый" y равен начальному x
x = x ^ y; // "новый" x равен начальному y
Несмотря на свою оригинальность, этот способ обмена особого практического значения не имеет, поскольку он медленнее, чем тот, что использует временную переменную.
Комментарии
comments powered by Disqus