關於通過異或交換兩個元素的值的乙個陷阱

2021-07-04 15:36:07 字數 545 閱讀 6386

#include #include using namespace std;

void swap(int *a,int *b)

int main(int argc, char *argv)

; int b = ;

swap(&a[0],&a[1]);

//將陣列b中的元素通過異或函式反轉

for(int i = 0,j = 4;i<=j;i++,j--)

//輸出a,b兩個陣列中的值

cout<

如果像上面的陣列中最中間的那個元素一樣,自己跟自己異或的話,那麼顯然是會置位0的,自己跟自己異或三次,結果顯然是0,但是如果是陣列中的兩個相等的元素進行異或交換的話,那麼則不會出現這種情況,那麼我們可以總結成以下一點:

如果兩個變數是同乙個物件的話,那麼用異或進行交換是會被置為0的,如果兩個變數是不同的兩個變數,那麼則不會出現這種情況,因為乙個不同的變數在記憶體中的位址並不是相同的,乙個變數的值的變換並不會影響另外乙個變數的值,而如果是自己跟自己異或,那麼在異或的函式中的第一步就會將自己置位0,顯然結果就是0,這就是異或函式的陷阱!

用異或交換兩個整數的陷阱

前面我們談到了,可用通過異或運算交換兩個數,而不需要任何的中間變數。如下面 void exchange int a,int b 然而,這裡面卻存在著乙個非常隱蔽的陷阱。通常我們在對陣列進行操作的時候,會交換陣列中的兩個元素,如exchang a i b j 這兒如果i j了 這種情況是很可能發生的 ...

指標的異或運算可用於交換兩個變數的值

指標是不能直接進行異或運算的,需要將指標轉換成整型int或long,在linux系統下只能是long,因為指標在win系統佔4個位元組,在linux系統佔6個位元組。以下為兩個指標的異或運算實現指標的交換 include int main 在linux 64系統中的執行結果為 a 0x7ffc70d...

使用三次異或操作交換兩個值

a和b是兩個ascii碼表中的可列印字元,經過以下三次異或操作,可以達到交換目的 a b b a a b 首先要理解,什麼是 異或 操作 二進位制兩數運算結果 0 0 0 0 1 1 1 0 1 1 1 0 相同為0,不同為1 因為ascii碼表中的字元都有對應十進位制的值 假設 a 10 其二進位...