XOR 演算を使用すると2つの数値の交換を実現できます。コードは以下のとおりです:

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;
}

一時変数法では、各代入において1つの変数の値をレジスタに読み込み、その後レジスタから別の変数に書き戻すだけでよいため、前後で2回のメモリ書き込み操作が必要です。一方、XOR 演算操作では、毎回2つのデータをレジスタに読み込み、演算操作を行い、その後結果を変数に書き戻す必要があるため、前後で合計3回のメモリ書き込み操作が必要です。もう1点、XOR 演算のコードは可読性が低いです。

上記の2つの方法をC言語で実装し、gcc コンパイラでコンパイルする場合、次のコマンドを使用できます。 gcc -S swap.c対応するアセンブリコードを確認すると、一時変数法のコード行数が少ないことがわかります。また、gccコンパイラを使用する場合、XOR 演算で配列を交換するとエラーが発生します。リンクを参照してください。

一時変数を導入せずに2つの数値の値を交換するには、3回の加減算を使用する方法もあります。コードは以下のとおりです:

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

この方法も同様に3回のメモリ書き込み操作が必要であり、コードの可読性も低いです。

最後に、3つの方法をコンパイルした後の対応するアセンブリコードの比較図を2枚添付します(プラットフォーム: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