Date Редакция Категория comp Теги C

Обмен значениями переменных 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