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)//第一种,也是最常用的一种
{
  int
t;
  t
=*a;
 
*a=*b;
  *b=t;
}


void
swap2(int*a,int*b)//第二种,不需要额外的内存空间(不用临时变量)
{
   *a=*a+*b;
  
*b=*a-*b;
  
*a=*a-*b;
}


void
swap3(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 交换数字

 

评分:0

我来说两句

smile665

smile665

Stay hungry, stay foolish. 得意之时谨记,一半命运还掌握在上帝手里;失意之时须知,一半命运还掌握在自己手里。

日历

« 2024-04-23  
 123456
78910111213
14151617181920
21222324252627
282930    

数据统计

  • 访问量: 955482
  • 日志数: 220
  • 建立时间: 2008-11-06
  • 更新时间: 2012-10-06

RSS订阅

Open Toolbar