不利用第三個變量,交換兩個變量的值

主要是利用異或操作。不過,我們首先需要確定aa=0a \bigoplus a=0
該操作並沒有帶來性能上的提升,下面是步驟詳解。

步驟 a b 備註
初始 2323 5656 -
第一步 2323 235623\bigoplus 56 令b中有56
第二步 232356=5623\bigoplus23\bigoplus56=56 235623\bigoplus 56 結合b去掉23只保留56,存儲在a中
第三步 5656 562356=2356\bigoplus23\bigoplus 56=23 結合a去掉56,只保留23,存儲在b中

下面是測試程序:

#include<stdio.h>

void exchange(int a, int b)
{
	printf("Before: a=%d,b=%d\n",a,b);
	b = a^b;
	a = a^b;
	b = a^b;
	printf("After:  a=%d,b=%d\n",a,b);
}

int main()
{
	int a = 23;
	int b = 56;
	exchange(a,b);
	return 0;
}

利用上面的方法,實現了對數組元素的交換:

#include<stdio.h>
void swap(int *x, int *y)
{
	*y = *x^*y;
	*x = *x^*y;
	*y = *x^*y;
}

void reverse_array(int a[], int cnt)
{
	int first;
	int last;
	for(first=0,last=cnt-1;first<=last;first++,last--)
	{
		if(first == last)
		{
			break;
		}
		swap(&a[first],&a[last]);
	}
}

int main()
{
	int a[] = {1,2,3,4,5};
	int aLength = 5;
	printf("Before: ");
	int i;
	for(i=0;i<aLength;i++)
	{
		printf("a[%d]=%d, ",i,a[i]);
	}

	reverse_array(a, aLength);
	printf("\nAfter:  ");
	int j;
	for(j=0;j<aLength;j++)
	{
		printf("a[%d]=%d, ",j,a[j]);
	}
	printf("\n");
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章