通过异或交换变量的数值,最我最为推荐的swap方法,相比
借用第三变量,“temp = a; a = b; b = temp” , 异或交换 更有效率!
利用加减法,“a = a + b; b = a - b; a = a - b”,异或交换 适用范围更广。这里的适用范围更广,说得有点牵强。加减法给我的直观感觉是 不安全,当“a = a + b”的结果超出了该变量类型所支持的数值范围,会不会出问题?也许是我多虑了,无符号整形有Carry(进位或借位 的标志位),符号整形使用补码参与运算,都是稳稳的,我在VS下做了测试,没有出错。我主要的忧虑是,有些单片机的C编译器,真的不够好。
#include
void swap(int *a, int *b)
{
// 如果a与b指向同一地址,三次异或的结果就是 *a = *b = 0
if (*a == *b)
{
return;
}
*a ^= *b; // 通过异或发现两者bit不同之处,bit不同的部分置1,bit相同部分置0
*b ^= *a; // bit相同部分不变,bit不同部分反转(即0变换1,1变0)
*a ^= *b;
}
int main()
{
int num1 = 50;
int num2 = 100;
printf("num1 = %d, num2 = %d\n", num1, num2);
swap(&num1, &num2);
printf("after swap:\nnum1 = %d, num2 = %d\n", num1, num2);
return 0;
}