参考博文:https://blog.csdn.net/oppo62258801/article/details/94145386
常用的编程中交换两个数的方法有如下三种:
1、中间变量交换法
2、位异或法
3、相加相减法
在实际的封装函数过程中,值传递的方式是单向的,不能实际的返回我们需要的交换后得到的两个结果,因此本文中的示例代码都通过传指针的方式来实现实际交换两个数
1、中间变量交换法
特点:引入一个中间变量交换两个数的值;
评价:实际使用过程中,这个版本是最安全的,不需要有额外的判断条件
函数如下
void swap_method1(int *data1,int *data2)
{
int temp = *data1;
*data1 = *data2;
*data2 = temp;
}
2、位异或法
特点:不需要引入中间变量
评价:需要注意,传入的两个值不能一样,如果一样的话就或导致交换后的两个结果都变为0,这个在排序中经常容易出现问题,需小心使用;
函数如下:
void swap_method2(int *data1,int *data2)
{
if(*data1 != *data2)
{
*data1 = *data1 ^ *data2;
*data2 = *data1 ^ *data2;
*data1 = *data1 ^ *data2;
}
}
补充小知识:位运算符号 ^ ,在数字电路(计算机组成)中有个名词叫异或,表示两个bit不同则位1,相同则位0
具体的来说,0^0 = 0 ; 1^1=0; 0^1=1;1^0=1;
因此要特别注意,为了避免在待交换的序列中可能存在两个数相同的情况,必须要判断传入的两个值是否相同,相同则不交换
3、相加相减法
特点:不需要引入中间变量
评价:需要注意可能存在的数字越界的情况, data1 和data2相加可能超过指定的数据类型范围;
函数如下:
void swap_method3(int *data1,int *data2)
{
*data1 = *data1 + *data2;
*data2 = *data1 - *data2;
*data1 = *data1 - *data2;
}