目录
使用局部变量temp完成交换(最优)
#include<iostream>
#include <stdio.h>
void swap1(int& a, int& b)
{
int temp = a;
a = b;
b = temp;
};
int main()
{
int x = 5, y = 8;
printf("x:%d, y:%d\n", x, y);
swap1(x, y);
printf("x:%d, y:%d\n", x, y);
system("pause");
return 0;
}
完成交换:
使用按位异或运算完成交换(次优)
异或的运算规则是:对于将参与运算的两数各对应的二进制位相异或,如果各个二进制位的两个值不相同,则异或结果为1。如果各个二进制位的两个值两个值相同,异或结果为0。之后,再把二进制位转换为十进制位,输出结果。
a | b | a⊕b |
1 | 0 | 1 |
1 | 1 | 0 |
0 | 0 | 0 |
0 | 1 | 1 |
#include<iostream>
#include <stdio.h>
void swap3(int& a, int& b)
{
a ^= b;
b ^= a;
a ^= b;
};
int main()
{
int x = 5, y = 8;
printf("x:%d, y:%d\n", x, y);
swap3(x, y);
printf("x:%d, y:%d\n", x, y);
system("pause");
return 0;
}
完成交换:
这是一个奇特的现象,如果对应的二进制位相同,则结果为0,否则结果为1,这样,连续运算3次即可交换a,b的值。
使用加减运算完成交换(最差)
#include<iostream>
#include <stdio.h>
void swap2(int& a, int& b)
{
a = a + b;
b = a - b;
a = a - b;
};
int main()
{
int x = 5, y = 8;
printf("x:%d, y:%d\n", x, y);
swap2(x, y);
printf("x:%d, y:%d\n", x, y);
system("pause");
return 0;
}
完成交换:
三种方式优缺点总结
以上三种方法,用加减法来实现交换的时候,有可能会发生数据溢出的问题,相比于此的话,用按位异或的方式和设定临时变量的方式就安全的多。但是,用按位异或的方式时,每次都需要读取两个数据到寄存器中,再进行运算操作,之后把结果写回到变量中,前后共需要三次内存写入操作。,效率很低,而且,会造成代码的可读性非常差,最重要的是,如果使用C语言实现上述两种方法,并用gcc编译器编译,可以使用命令 gcc -S swap.c 查看相应的汇编代码,临时变量法代码行数更少,另外使用 gcc 编译器时,用异或运算交换数组会出错。故,采用临时变量的方式,每次赋值只要读取一个变量的值到寄存器,然后再从寄存器写回到另一个变量中即可,前后涉及两次内存写入操作,相比之下更安全,更高效!