認清C/C++程式設計之-----異或運算
阿新 • • 發佈:2018-11-17
使用異或進行資料交換,很早以前有的程式設計師使用下面的方法進行兩個資料之間的交換
果:1 1 0 0
曾在網上看到有的朋友說a與b的值如果一樣,即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; //錯誤的作法;
}
這種做法看上去不錯,但我們不可能正確使用它.因為編譯法則不允許同一個表示式兩次修改一個變數的值;
這會引起不確定狀態的結果.
a^=b;
b^=a;
a^=b;
即a^=b^=a^=b;
只有在兩個比較的位不同時其結果為1,否則為0即[兩個輸入相同時為0,不同時為1]
(異或原則:0 1 0 1
1 0 0 1
結
曾在網上看到有的朋友說a與b的值如果一樣,即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;進行清零操作。並且劇說效率更高,我們也可以進行這樣的使用如:
那麼當我們如下使用異或運算時為什麼會出錯呢?
void exchange(int &a,int &b)
{a^=b^=a^=b; //錯誤的作法;
}
這種做法看上去不錯,但我們不可能正確使用它.因為編譯法則不允許同一個表示式兩次修改一個變數的值;
這會引起不確定狀態的結果.