La operación XOR puede lograr el propósito de intercambiar los dos números, el código es el siguiente:

void swap(int &a, int &b)
{
    a = a^b;
    b = a^b;
    a = a^b;
}

Pero no se recomienda usar este método, se adjunta la explicación comparativa con el método común de variable temporal.

Método de variable temporal:

void swap(int &a, int &b)
{
    int tmp = a;
    a = b;
    b = tmp;
}

Para el método de variable temporal, cada asignación solo necesita leer el valor de una variable en el registro y luego escribirlo desde el registro de vuelta a otra variable; en total implica dos operaciones de escritura en memoria. Pero para la operación XOR, cada vez necesita leer dos datos en los registros, luego realizar la operación, y después escribir el resultado de vuelta a la variable; en total se necesitan tres operaciones de escritura en memoria. Otro punto: la legibilidad del código de la operación XOR es deficiente.

Si se usan las implementaciones de los dos métodos anteriores en C y se compilan con el compilador gcc, se puede usar el comando gcc -S swap.cpara ver el código ensamblador correspondiente. El método de variable temporal tiene menos líneas de código. Además, al usargccel compilador, el intercambio de matrices con la operación XOR puede fallar, ver enlace.

Sin introducir una variable temporal, también se pueden intercambiar los valores de dos números usando tres sumas y restas, el código es el siguiente:

void swap(int &a, int &b)
{
    a = a + b;
    b = a - b;
    a = a - b;
}

Este método también requiere tres operaciones de escritura en memoria, y además la legibilidad del código es deficiente.

Finalmente, se adjuntan dos gráficos comparativos del código ensamblador compilado de los tres métodos (plataforma:Ubuntu14.04,gcc 4.8.4), en la figuraswap1.cel archivo corresponde al método de variable temporal,swap2.cel archivo corresponde al método de suma y resta,swap3.cel archivo corresponde al método XOR. Se puede ver que el método de variable temporal produce la menor cantidad de código ensamblador, es decir, es más eficiente. La diferencia entre el método de suma/resta y el método XOR es solo la forma de calcular; los pasos de operación son idénticos.

Figura 1: Comparación del código ensamblador entre el método de variable temporal y el método de suma/resta. Haga clic en la imagen para verla en grande.

Figura 2: Comparación del código ensamblador entre el método XOR y el método de suma/resta. Haga clic en la imagen para verla en grande.

Dirección original: 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