【初级】数字交换的几种方法

实现一个swap函数,交换两个变量数值,并分析每种方式的区别!


中间变量交换法

代码如下:

void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}

优点:1.简单,可读性强;2.如果a和b引用的是同一个变量,原变量值不受影响;
缺点:需要开辟一个中间变量

加减乘除法预算

代码如下:

void swap(int *a, int *b) {
*a = *a + *b;
*b = *a - *b;
*a = *a - *b;
}

优点:省去中间变量,可读性强;
缺点:1.可能产生数值溢出问题;2.如果a和b引用的是同一个变量,结果会变为0;
原理:求和求差还原数值;加减乘除均可使用这种思想;

异或交换

代码如下:

void swap(int *a, int *b) {
*a = *a^*b;
*b = *a^*b;
*a = *a^*b;
}

优点:没有产生进位 / 借位,不会产生溢出问题
缺点:如果a和b引用的是同一个变量,结果会变为0;
原理:同上,本质是通过差异推算

差异法推算
简单来说,我们只要知道a和b的差异(diff),就可以用a和diff推算出b,也可以用b和diff推算出a...
a^b=diff (a和b的差异是diff)
a^diff=b (a和diff的差异是什么呢?当然是b)
b^diff=a (b和diff的差异是什么呢?当然是a)


此外还有位与运算等其他方法,这里不作介绍;

以上方法, 时间效率上面不会有太大差别,作者推荐优先使用 中间变量法 ,易读,运算结果准确;

你可能感兴趣的:(【初级】数字交换的几种方法)