All things are difficult before they are easy. 没有软件的裸机是一具僵尸,没有硬件的软件是一个幽灵。2012,专注于Linux和C语言,关注自动化、性能测试,关注开源社区和开源测试工具、方法,尝试测试团队管理!
交换两个整数的三种实现方法(C/C++)
上一篇 /
下一篇 2010-10-04 20:55:47
/ 个人分类:C/C++
交换两个整数的方法,主要有三种。注意,这里的形参都是指针(或引用),直接的值传递并不能交换两个数。
voidswap1(int*a,int*b)//第一种,也是最常用的一种 { intt; t=*a; *a=*b; *b=t; }
voidswap2(int*a,int*b)//第二种,不需要额外的内存空间(不用临时变量) { *a=*a+*b; *b=*a-*b; *a=*a-*b; }
voidswap3(int*a,int*b)//第三种,不需要额外的内存空间,位运算实现 { *a^=*b; *b^=*a; *a^=*b; } |
看了一下,网上童鞋们对着三种交换方法的效率的比较:1>3>2
第一种,最常用,也是最基本的,效率其实最高的;
第三种,在内置数据类型比较常用,也就局限于整形。
第二种,貌似牛x,其实最傻,最没效率的就是它。
其实,对于整型数据,数值比int能表示的最大值更大也没关系,这些交换都是可以成功的。(可以试验一下,我用100000000和200000000交换也可以正常的,见下面的代码)。
#include <stdio.h>
/* void swap(unsigned char *a, unsigned char *b);*/ void swap(unsigned int *a, unsigned int *b);
int main() { /* unsigned char aa,bb; */ unsigned int aa,bb; aa = 100000000; bb = 200000000; swap(&aa,&bb); printf("aa=%d,bb=%d\n",aa,bb); return 0; }
/* void swap(unsigned char *a, unsigned char *b) { *a = *a+*b; *b = *a-*b; *a = *a-*b; } */
void swap(unsigned int *a, unsigned int *b) { *a = *a+*b; *b = *a-*b; *a = *a-*b; } |
另外,对第三种异或来实现的方法可能有点难理解,那么给两个证明如下:
voidswap(int*a,int*b)//第三种 {*a^=*b; *b^=*a; *a^=*b; } ============================= 证明:*a=*a^*b1 *b=*b^*a2 *a=*a^*b3 另*a=x,*b=y ============================= 第一步:*a=x^y ,*b=y 第二步:*a=x^y,*b=y^x^y*b=x//两个相同的数异或等于0,0与任何一个数异或等于那个数本身 第三步:*a=x^y^x*a=y;*b=x; //就实现了交换 |
/*假设数据(都只用4位)a,b,c,d的各位分别为 (a3 a2 a1 a0),(b3 b2 b1 b0),(c3 c2 c1 c0)和(d3 d2 d1 d0)
则 c=a^b .......<1>
为:
a3 a2 a1 a0 <----> a
^ b3 b2 b1 b0 <----> b
---------------------------
a3^b3 a2^b2 a1^b1 a0^b0 <----> c
然后d=c^b .......<2>
为:
a3^b3 a2^b2 a1^b1 a0^b0 <----> c
^ b3 b2 b1 b0 <----> b
---------------------------
a3 a2 a1 a0 <----> d
=> d=a .......<3>
将 <3>式代入<2>式有: a=c^b ......<4>
将 <1>式代入<4>式有: a=a^b^b ......<4>
证明完毕。*/ |
收藏
举报
TAG:
swap
交换数字