這篇文章中將使用C語言,實現交換兩個任意類型變量的功能.說到任意類型用C讓人感覺很難做,如果是C++則使用模板函數就輕松搞定:
template<class T> inline void swap(T& t1, T& t2) { T tmp; tmp = t1; t1 = t2; t2 = tmp; }
先說下使用^來交換兩個整數,其代碼看著簡單但不容易理解
a ^= b; b ^= a; a ^= b;
有人說這種寫法很奇葩,但我要說的是,異或運算是計算機很常用的操作.搞懂這一算法是熟練掌握異或的基礎.關於^交換兩整數的理解方式可以按如下方式:
先將a,b當成兩個布爾類型,那麼a,b會有四種組合
0,0 (1)a ^= b;變成 0,0 (2)b ^= a;變成 0,0 (3)a ^= b;變成 0,0
1,0 (1)a ^= b;變成 1,0 (2)b ^= a;變成 1,1 (3)a ^= b;變成 0,1
0,1 (1)a ^= b;變成 1,1 (2)b ^= a;變成 1,0 (3)a ^= b;變成 1,0
1,1 (1)a ^= b;變成 0,1 (2)b ^= a;變成 0,1 (3)a ^= b;變成 1,1
這樣三句代碼執行完成後,四種組合中的數值都得到了交換.
即然位運算與BIT相鄰數值無關的,那麼8個BIT的char類型,16個BIT的short,以及long, long long都可以使用^來交換.
還有人認為這種異或運算只能用於整數類型的交換.實際上異或運算是針對二進制的,既然計算機所有的數據類型都是以二進制進行保存的,那麼當然可以用異或運算交換任何數據類型.
最後我的解決方案如下:
1 #define XYZ_SWAP(i, j) \
if (&i != &j)\ 2 {\ 3 switch(sizeof(i))\ 4 {\ 5 case 1:\ 6 *(char*)&i ^= *(char*)&j;\ 7 *(char*)&j ^= *(char*)&i;\ 8 *(char*)&i ^= *(char*)&j;\ 9 break;\ 10 case 2:\ 11 *(short*)&i ^= *(short*)&j;\ 12 *(short*)&j ^= *(short*)&i;\ 13 *(short*)&i ^= *(short*)&j;\ 14 break;\ 15 case 4:\ 16 *(long*)&i ^= *(long*)&j;\ 17 *(long*)&j ^= *(long*)&i;\ 18 *(long*)&i ^= *(long*)&j;\ 19 break;\ 20 case 8:\ 21 *(long long*)&i ^= *(long long*)&j;\ 22 *(long long*)&j ^= *(long long*)&i;\ 23 *(long long*)&i ^= *(long long*)&j;\ 24 break;\ 25 default:\ 26 for (int k = 0; k < sizeof(i); k++)\ 27 {\ 28 *((char*)&i + k) ^= *((char*)&j + k);\ 29 *((char*)&j + k) ^= *((char*)&i + k);\ 30 *((char*)&i + k) ^= *((char*)&j + k);\ 31 }\ 32 break;\ 33 }\ 34 } 35 36 void main() 37 { 38 char ca = 10; 39 char cb = 20; 40 XYZ_SWAP(ca, cb); 41 42 short sa = 10; 43 short sb = 20; 44 XYZ_SWAP(sa, sb); 45 46 int ia = 10; 47 int ib = 20; 48 XYZ_SWAP(ia, ib); 49 50 long long lla = 10; 51 long long llb = 20; 52 XYZ_SWAP(lla, llb); 53 54 float fa = 10.01f; 55 float fb = 2000.89f; 56 XYZ_SWAP(fa, fb); 57 58 double da = 10.01; 59 double db = 2000.89; 60 XYZ_SWAP(da, db); 61 62 void* pa = &da; 63 void* pb = &db; 64 XYZ_SWAP(pa, pb); 65 }
這裡使用了個宏定義來實現不同類型的兩個變量的交換.還有就是假設long占用4個字節.
int a = *;
int b = *;
a = a ^ b;
b = b ^ a;
a = a ^ b;
就能實現ab的交換了
舉例:
#include<stdio.h>
{
int a=2,b=3;
a=a+b;
b=a-b;
a=a-b;
printf("a=%d,b=%d\n",a,b);
}