用異或交換兩個整數的陷阱
阿新 • • 發佈:2019-02-02
前面我們談到了,可用通過異或運算交換兩個數,而不需要任何的中間變數。 如下面:
然而,這裡面卻存在著一個非常隱蔽的陷阱。
通常我們在對陣列進行操作的時候,會交換陣列中的兩個元素,如exchang(&a[i], &b[j]), 這兒如果i==j了(這種情況是很可能發生的),得到的結果就並非我們所期望的。
既然這樣,我們就不能夠在任何使用交換的地方採用異或了,即使要用,也一定要在交換之前判斷兩個數是否已經相等了,如下:
-
void exchange(int&a,int&b)
-
{
-
a ^=b;
-
b ^=a;
-
a ^=b;
- }
然而,這裡面卻存在著一個非常隱蔽的陷阱。
通常我們在對陣列進行操作的時候,會交換陣列中的兩個元素,如exchang(&a[i], &b[j]), 這兒如果i==j了(這種情況是很可能發生的),得到的結果就並非我們所期望的。
-
void main()
-
{
-
inta[2]={1,2};
-
exchange(a[0],a[1]);
//交換a[0]和a[1]的值
-
printf("1---a[0]=%d a[1]=%d\n",a[0],a[1]);
-
exchange(a[0],a[0]);
//將a[0]與自己進行交換
-
printf("2---a[0]=%d a[1]=%d\n",a[0],a[1]);
- }
- 1---a[0]=2 a[1]=1
- 2---a[0]=0 a[1]=1
-
a ^=a;
-
a ^=
- a ^=a;
既然這樣,我們就不能夠在任何使用交換的地方採用異或了,即使要用,也一定要在交換之前判斷兩個數是否已經相等了,如下:
-
void exchange(int&a,int&b)
-
{
-
if(a==b)return;//防止&a,&b指向同一個地址;那樣結果會錯誤。
-
a ^=b;
-
b ^=a;
-
a ^=b;
- }