Tips!如何寫一個效率更高的swap函數?

從剛開始接觸 cpp 你們都會學習的一個東西就是如何交換兩個變量的值,通常要新設置一個變量來儲存中間值,而後進行賦值運算。下面要介紹的方法能夠省去新建一個變量的空間,使用的位運算還能夠提升效率。ios

#include<iostream>
using namespace std;
void swap(int &a,int &b){
    a ^= b;
    b ^= a;
    a ^= b;
}
int main(){
    int m = 1;
    int n = 2;
    swap(m, n);
    cout << m << " " << n << endl;
}

這裏的'^'就是異或運算符⊕。
首先讓a = a ⊕ b。
b = b ⊕ a,那麼 b = b ⊕ a = b ⊕ a ⊕ b,因此b = a。
最後,a = a ⊕ b,那麼 a = a ⊕ b = a ⊕ b ⊕ a = b。
至此,完成了 a 和 b 的交換。
可是,存在的一個問題就是,不能讓本身和本身進行交換,即:
swap(a,a);
由於:
a = a^a = 0;
a = a^a = 0;
a = a^a = 0;
這樣會使得這個數變成0。
所以遇到會讓單個元素本身與本身進行交換的狀況下,例如快排算法的時候,仍是老老實實用傳統方法比較合適。算法

相關文章
相關標籤/搜索