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

