交换函数swap的四种写法:
1、经典法——嫁衣法:
void swap(int *a,int *b) { int temp = *a; *a = *b; *b = temp; }
2、经典改进法——泛型法:(适用于各种参数类型)
void swap(void *a, void *b, int data_type_size) { unsigned char *p = (unsigned char *)a; unsigned char *q = (unsigned char *)b; unsigned char temp; while(data_type_size--) { temp = *p; *p = *q; *q = temp; p++; q++; } }
3、赋值法:
void swap(int *a, int *b) { *a = *a + *b; *b = *a - *b; *a = *a - *b; }
4、异或运算法:
void swap(int *a, int *b) { *a = *a ^ *b; *b = *a ^ *b; *a = *a ^ *b; }
第三四种方法也可以结合第二种的泛型方法,实现所有数据类型的转换。
关于异或运算:异或运算是指: 参与运算的两个值,如果两个相应位相同,则结果为0,否则为1。
异或的3个特点:
(1) 0^0=0,0^1=1 0异或任何数 = 任何数
(2) 1^0=1,1^1=0 1异或任何数 = 任何数取反
(3) 任何数异或自己 = 0
异或的几个常见用途:
(1)使某些特定位翻转
例如对数10100001的第2位和第3位翻转,则可以将该数与00000110进行按位异或运算。
10100001^00000110 = 10100111
(2)实现两个值的交换,而不必使用临时变量。如上第四种方法,实质上使用了 A^A = 0; A^0 = A; 这两条性质。
(3)在汇编语言中经常用于将变量置零:xor ax,ax
(4)快速判断两个整数值是否相等。
举例1: 判断两个整数a,b是否相等,则可通过下列语句实现:
return ( (a ^ b) == 0 )
参考