不借用第三变量互换两个变量

本文介绍了四种数据交换的方法:算术运算、指针地址操作、位运算及栈实现,并详细解析了每种方法的工作原理和优缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

下面使用四种方式进项交换,分别是:算术运算;指针地址操作;位运算;栈实现

 

1) 算术运算

    int a,b;

 

 

    a=10;b=12;

 

 

 

    a=b-a;
    b=b-a;
    a=b+a;

 

 

           缺点:是只能用于数字类型,字符串之类的就不可以了。a+b有可能溢出(超出int的范围),溢出是相对的, +了溢出了(不安全)

 

 

 

2) 指针地址操作

    int *a,*b;
    *a=new int(10);
    *b=new int(20);             //&a=0x00001000h,&b=0x00001200h

     a=(int*)(b-a);                 //&a=0x00000200h,&b=0x00001200h
    b=(int*)(b-a);                 //&a=0x00000200h,&b=0x00001000h
    a=(int*)(b+int(a));         //&a=0x00001200h,&b=0x00001000h

          操作系统把内存分为几个区域:系统代码/数据区、应用程序代码/数据区、堆 栈区、全局数据区等等。在编译源程序时,常量、全局变量等都放入全局数据区,局部变量、动态变量则放入堆栈区。

        这样当算法执行到“a=(int*)(b-a)”时,a的值并不是0x00000200h,而是要加上变量a所在内存区的基地址,实际的结果是:0x008f0200h,其中0x008f即为基地址,0200即为a在该内存区的位移。它是由编译器自动添加的。因此导致以后的地址计算均不正确,使得a,b指向所在区的其他内存单元。

        再次,地址运算不能出现负数,即当a的地址大于b的地址时,b-a<0,系统自动采用补码的形式表示负的位移,由此会产生错误,导致与前面同样的结果。

 

 

 

 

 

 

        改进的算法:(采用位运算中的与运算)

       

         if(a<b)  {

 

                a=(int*)(b-a);
                b=(int*)(b-(int(a)&0x0000ffff));
                a=(int*)(b+(int(a)&0x0000ffff));
          }   else  {
                b=(int*)(a-b);

 

               a=(int*)(a-(int(b)&0x0000ffff));

                b=(int*)(a+(int(b)&0x0000ffff));

           }

                优点:即在交换很大的数据类型时,它的执行速度比算术算法快。因为它交换的是地址,而变量值在内存中是没有移动过的。(以下称为地址算法)

 

3) 位运算

        int a=10,b=12;                  //a=1010^b=1100;

        

        a=a^b;                              //a=0110^b=1100;

        b=a^b;                             //a=0110^b=1010;

        a=a^b;                             //a=1100=12;b=1010;

        

           (异或运算, 通过异或运算能够使数据中的某些位翻转,其他位不变。这就意味着任意一个数与任意一个给定的值连续异或两次,值不变)

 


4)栈实现。


            int exchange(int x,int y)  {

 

 

                 stack S;

                push(S,x);

 

 

                push(S,y);

 

                x=pop(S);

                y=pop(S);

            }

 

 

        总结:前两种只能进行整形数据的交换

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值