1. 程式人生 > >認清C/C++程式設計之-----異或運算

認清C/C++程式設計之-----異或運算

使用異或進行資料交換,很早以前有的程式設計師使用下面的方法進行兩個資料之間的交換

      a^=b;
b^=a;
a^=b;
a^=b^=a^=b;
只有在兩個比較的位不同時其結果為1,否則為0[兩個輸入相同時為0,不同時為1]
    
(異或原則:0 1 0 1 
                         1 0 0 1
       
        

果:1 1 0 0
曾在網上看到有的朋友說ab的值如果一樣,即a=b時,這個演算法不成立值會被清零,我們詳細的分析一下資料交換的過程,我們以二進位制來表示:如a=b=0101
a^=b;   //a=a^b=0101^0101   
結果a=0000
b^=a;   //b=b^a=0101^0000   
結果b=0101
a^=b;   //a=a^b=0000^0101   
結果a=0101
所以我們使用異或進行資料交換是完全成立的。
同時,我們以後也可以使用a^=a;進行清零操作。並且劇說效率更高,我們也可以進行這樣的使用如:
if(a^b==0) if(a-b==0)的判斷效率更高
那麼當我們如下使用異或運算時為什麼會出錯呢? 

void exchange(int &a,int &b)
{a^=b^=a^=b;                           //錯誤的作法;
}
這種做法看上去不錯,但我們不可能正確使用它.因為編譯法則不允許同一個表示式兩次修改一個變數的值;
這會引起不確定狀態的結果.