swapの三つの実現と区別

1169 ワード

私たちはswap関数またはマクロ定義を実現する時、よく次のような方法を使います.
  • 補助変数を使用する
  • 加減法を使う
  • ビット演算
  • を使用する.
    私は以前swapを使っていましたが、この3つの方法を区別したことがありません.それらの効果は完全に一致しています.違いがあっても、プラスマイナス法を使うとオーバーフローする可能性があります.しかし、これらはまだ違いがあります.交換される2つのオブジェクトが同じ変数である場合、後の2つの方法はエラーが発生します.
    #define swap1(a,b) {int t = a; a = b; b = t;}
    #define swap2(a,b) {a = a+b; b = a - b; a = a-b;}
    #define swap3(a,b) {a = a^b; b = a^b; a = a^b;}
    
    int main()
    {
        int a = 1, b = 2, c = 3;
        swap1(a, a); //a = 1
        swap2(b, b); //b = 0
        swap3(c, c); //c = 0
    }
    エラーが発生する理由は簡単である.後者の2つの方法では、交換する変数を繰り返し計算し、その値がクリアされるようにした.このエラーの発生は、交換アルゴリズム自体によるものですので、swap関数の異なる実装を使用する前に、変数自身の交換があるかどうかを事前に考慮しなければなりません.