Die XOR-Operation kann das Ziel erreichen, zwei Zahlen zu vertauschen, der Code ist wie folgt:

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

Von dieser Methode wird jedoch abgeraten,und hier ist eine vergleichende Erläuterung zur üblichen Methode mit temporärer Variable.

Methode mit temporärer Variable:

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

Bei der Methode mit temporärer Variable muss bei jeder Zuweisung nur der Wert einer Variablen in ein Register gelesen und dann aus dem Register in eine andere Variable zurückgeschrieben werden, was insgesamt zwei Speicherschreibvorgänge umfasst. Bei der XOR-Operation hingegen müssen jedes Mal zwei Daten in Register gelesen, dann die Operation ausgeführt und anschließend das Ergebnis zurück in die Variable geschrieben werden, was insgesamt drei Speicherschreibvorgänge erfordert. Außerdem ist die Lesbarkeit des Codes bei der XOR-Operation schlecht.

Wenn Sie die beiden oben genannten Methoden in C implementieren und sie mit dem gcc-Compiler kompilieren, können Sie den Befehl gcc -S swap.cverwenden, um den entsprechenden Assembler-Code anzuzeigen. Die Methode mit temporärer Variable hat weniger Codezeilen. Außerdem, wenn Sie dengccCompiler verwenden, verursacht das Vertauschen von Arrays mit XOR-Operation Fehler, siehe Link.

Ohne eine temporäre Variable einzuführen, können Sie auch drei Additions-/Subtraktionsoperationen verwenden, um die Werte zweier Zahlen zu vertauschen, der Code ist wie folgt:

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

Diese Methode erfordert ebenfalls drei Speicherschreibvorgänge, und die Lesbarkeit des Codes ist ebenfalls schlecht.

Abschließend sind zwei Vergleichsdiagramme des entsprechenden Assembler-Codes nach dem Kompilieren der drei Methoden beigefügt (Plattform:Ubuntu14.04,gcc 4.8.4), in den Abbildungen entspricht die Dateiswap1.cder Methode mit temporärer Variable,swap2.cdie Datei entspricht der Additions-/Subtraktionsmethode,swap3.cdie Datei entspricht der XOR-Methode. Es ist zu erkennen, dass die Methode mit temporärer Variable den geringsten Assembly-Code erzeugt, was höhere Effizienz bedeutet. Der Unterschied zwischen der Additions-/Subtraktionsmethode und der XOR-Methode besteht nur in der Berechnungsmethode; die Operationsschritte sind identisch.

Abbildung 1: Vergleich des Assembly-Codes zwischen der Methode mit temporärer Variable und der Additions-/Subtraktionsmethode. Klicken Sie auf das Bild, um eine größere Version anzuzeigen.

Abbildung 2: Vergleich des Assembly-Codes zwischen der XOR-Methode und der Additions-/Subtraktionsmethode. Klicken Sie auf das Bild, um eine größere Version anzuzeigen.

Originaladresse: 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