1. 程式人生 > >【編程題】不引入第三個變量,而交換兩個變量的值

【編程題】不引入第三個變量,而交換兩個變量的值

其中 blog b+ 沒有 來源 article else 位移 text

不引入第三個變量,而交換兩個變量的值

方法一:算術運算

1 int a,b;
2 a=10;b=12;
3 a=b-a;    //a=2;b=12
4 b=b-a;    //a=2;b=10       
5 a=a+b;    //a=12;b=10

它的原理:把a,b看做數軸上的兩個點。

第一句“a=b-a”求出了ab兩點之間的距離,並且將其保存在a中;

第二句“b=b-a”求出了a到原點的距離(b到原點的距離減去ab兩點距離),並且將其保存在b中;

第三句“a=b+a”求出了b到原點的距離(a到原點的距離加上ab兩點距離),並且將其保存在a中。

缺點:只能用於數字類型,字符串的交換就不行。

方法二:位運算

1 int a=10,b=12;
2 a=a^b;
3 b=a^b;
4 a=a^b;

它的原理:任意一個數與任意一個給定的數異或兩次,值不變。

方法三:指針操作

 1 int *a,*b;
 2 a=new int(20);
 3 b=new int(10);
 4 if(a<b)
 5 {
 6     a=(int*)(b-a);
 7     b=(int*)(b-(int(a)&0x0000ffff));
 8     a=(int*)(b+(int(a)&0x0000ffff));
 9 }
10 else
11 {
12     b=(int*)(a-b);
13     a=(int
*)(a-(int(b)&0x0000ffff)); 14 b=(int*)(a+(int(b)&0x0000ffff)); 15 }

它的原理:它交換的是a和b的地址,而變量的值在內存中是沒有移動過的。

其中,與運算“int(a)&0x0000ffff”,因為地址中高16位為段地址,後16位為位移地址,將它和0x0000ffff進行與運算後,段地址被屏蔽,只保留位移地址。例如:若&a=0x008f0200h,&b=0x008f1200h,在執行“a=(int*)(b-a);”時,a的值並不是0x00000200h,而是要加上變量a所在內存區的基地址,即實際結果是0x008f0200h。其中,0x008f是基地址,0200是a在該內存區的位移。

其次,地址運算不能出現負數,所以要先判斷a和b的大小。

如有不對的地方,非常歡迎給予指導!

——【感謝】資料來源於http://blog.csdn.net/kangkermit/article/details/21371159

【編程題】不引入第三個變量,而交換兩個變量的值