如果让你写一个swap函数,你会怎么写呢?
正常人应该都是这么写的
void swap(int &a,int &b)
{
int temp;
temp=a;
a=b;
b=temp;
}
但如果不能使用中间变量来进行交换呢?
有以下两种方法
void swap(int &a,int &b)
{
a=a+b;
b=a-b;
a=a-b;
}
void swap(int &a,int &b)
{
a^=b;
b^=a;
a^=b;
}
第一种应该都好理解,第二种则是利用了逻辑运算中的异或运算来交换两个整形变量的值。
具体分析一下第二种的异或运算法。
若a=0,b=1
a^=b之后,a=1,b=1
b^=a之后,a=1,a=0
a^=b之后,a=1,b=0
即完成交换。
另外三种情况(a=1,b=0和a=0,b=0和a=1,b=1)也同样可以验证。
但是这两种方法都有很明显的缺陷。第一种比较容易溢出,而第二种则无法应用到浮点型数据的交换上去。
为了尝试能找到一种比较万能的swap函数,去参考了下memcpy函数,那么,可以模仿着来写
void swap(void *a,void *b,size_t size)
{
unsigned char *p1=(unsigned char *)a;
unsigned char *p2=(unsigned char *)b;
while(size--)
{
*p1^=*p2;
*p2^=*p1;
*p1^=*p2;
p1++;
p2++;
}
}
这样的一个函数还是存在着空间复杂度较大的问题,但是它能比较好地解决数据类型的问题,基本上所有的数据类型都能通过这个函数来进行交换。它的本质就是将数据分割成几个字节分别进行交换。但是它也同样无法交换不同类型的数据。
要找到一个更好的swap函数、万能的swap函数,还需要很大的努力!