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

#include <stdio.h>
#include <iostream>
using namespace std;

void swap(int *a,int *b){
	*a = *a ^ *b;
	*b = *a ^ *b;//將a的值賦給了b
	*a = *b ^ *a;//將b的值賦給了a
}
int main(int argc, char *argv[])
{
	int a[] = {1,1};
	int b[] = {1,2,3,4,5};
	swap(&a[0],&a[1]);
	//將數組b中的元素通過異或函數反轉
	for(int i = 0,j = 4;i<=j;i++,j--){
		swap(&b[i],&b[j]);
	}
	//輸出a,b兩個數組中的值
	cout<<a[0]<<a[1]<<endl;//輸出的結果是11
	cout<<b[0]<<b[1]<<b[2]<<b[3]<<b[4]<<endl;//輸出的結果是54021
	return 0;
}

相信很多人學c的時候都會接觸到一個用異或來交換兩個變量的值的函數,但是如果將這個函數應用到奇數長度的數組中的數組元素的反轉中,則會出現一個意外的情況,那就是數組中間的那個元素會置爲0,如果數組長度是偶數,那麼則不會出現這種情況,如果是兩個相等的變量進行異或交換的話,也同樣不會出現這種情況,我查閱了一些資料,寫下自己的一些理解。

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

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章