Алгоритм обмена значений переменных при помощи исключающего ИЛИ

Обменять значения двух переменных одинакового типа без использования третьей (буферной) переменной.

Дополнительные свойства
Описанный ниже алгоритм работает за счет свойства симметричного различия, которым обладает операция XOR:
A XOR A = 0 для всех A.

Алгоритм (один из способов реализации поставленной задачи)
1. XOR X и Y и сохраняем в X
2. XOR X и Y и сохраняем в Y
3. XOR X и Y и сохраняем в X

Реализация алгоритма

#include <iostream>
 
using namespace std;
 
 
void XOR_Swap(int *x, int *y);
 
 
int main()
{
	int x;
	int y;
 
	cout << "Enter 1st number: x = ";
	cin >> x;
 
	cout << "Enter 2nd number: y = ";
	cin >> y;
 
	cout << endl;
 
	cout << "Performing XOR_Swap operation..." << endl;
 
	cout << endl;
 
	XOR_Swap(&x, &y);
 
	cout << "Now x = " << x << " and y = " << y << endl;
 
	cout << endl;
 
	system("PAUSE");
 
	return 0;
}
 
 
void XOR_Swap(int *x, int *y)
{
   *x ^= *y;
   *y ^= *x;
   *x ^= *y;
}

Пример работы программы
Enter 1st number: x = 1111
Enter 2nd number: y = 2222

Performing XOR_Swap operation...

Now x = 2222 and y = 1111

Анализ алгоритма
Эффективен за счет экономии памяти.

Критические замечания
В инструкциях машинного кода алгоритм выглядит следующим образом:
XOR R1, R2
XOR R2, R1
XOR R1, R2
где R1 и R2 - регистры процессора, а операция XOR сохраняет результат в первом аргументе. Этот алгоритм особенно привлекателен для программирования микроконтроллеров в силу его эффективности, так как он убирает необходимость использования промежуточного регистра, который обычно является ограниченным ресурсом. Кроме того, алгоритм уничтожает две операции доступа к памяти, которые (выражаясь в ресурсе времени) намного дороже операций с регистрами.

Ключевые слова: 
обмен значений переменных, XOR, исключающее ИЛИ
ВложениеРазмер
www.opita.net_XOR_Swap.rar4.72 кб