Операция XOR может достичь цели обмена двух чисел, код выглядит следующим образом:
void swap(int &a, int &b)
{
a = a^b;
b = a^b;
a = a^b;
}
Но этот метод не рекомендуется использовать,и вот сравнительное объяснение с обычным методом временной переменной.
Метод временной переменной:
void swap(int &a, int &b)
{
int tmp = a;
a = b;
b = tmp;
}
Для метода временной переменной при каждом присваивании нужно только считать значение одной переменной в регистр, а затем записать его обратно из регистра в другую переменную, что в сумме включает две операции записи в память. Однако для операции XOR каждый раз необходимо считать два значения в регистры, затем выполнить операцию и после этого записать результат обратно в переменную, что требует в сумме трёх операций записи в память. Кроме того, читаемость кода с операцией XOR низкая.
Если вы используете язык C для реализации двух вышеуказанных методов и компилируете их с помощью компилятора gcc, можно воспользоваться командой gcc -S swap.cчтобы просмотреть соответствующий ассемблерный код. В методе временной переменной меньше строк кода. Кроме того, при использованииgcc-компилятора, обмен массивов с помощью операции XOR вызовет ошибки, см. ссылку.
Без введения временной переменной можно также использовать три операции сложения/вычитания для обмена значений двух чисел, код выглядит следующим образом:
void swap(int &a, int &b)
{
a = a + b;
b = a - b;
a = a - b;
}
Этот метод также требует трёх операций записи в память, и читаемость кода также низкая.
Наконец, прилагаются две сравнительные диаграммы соответствующего ассемблерного кода после компиляции трёх методов (платформа:Ubuntu14.04,gcc 4.8.4), на рисунках файлswap1.cсоответствует методу временной переменной,swap2.cфайл соответствует методу сложения/вычитания,swap3.cфайл соответствует методу XOR. Видно, что метод временной переменной компилируется в наименьший объём ассемблерного кода, что означает более высокую эффективность. Разница между методом сложения/вычитания и методом XOR состоит только в способе вычисления; шаги операции идентичны.
Рисунок 1: Сравнение ассемблерного кода между методом временной переменной и методом сложения/вычитания. Нажмите на изображение, чтобы просмотреть увеличенную версию.
Рисунок 2: Сравнение ассемблерного кода между методом XOR и методом сложения/вычитания. Нажмите на изображение, чтобы просмотреть увеличенную версию.
Исходный адрес: https://tangxuan1023.github.io/2018/02/09/%E4%BA%A4%E6%8D%A2%E4%B8%A4%E6%95%B0%E7%9A%84%E5%80%BC/#more

