交换两个整数

今天写程序的时候回想起曾经好像在那见过没有使用中间变量进行两个整数的交换,马马虎虎地记得那时通过加减法来实现的,所以就查了一下资料,果然存在这这种方法,代码如下:

void swap1 (int& x,int& y)
{
             x=x+y;
             y=x-y;
             x=x-y;
}

void swap2 (int &x,int &y)
{
             x=x-y;
             y=x+y;
             x=y-x;
}


但是,上述两种方法也存在各自的缺陷,对于swap1函数来说,如果x和y两个数是同号的话,会导致溢出;对于swap2函数来说,如果x和y是异号的话,也会导致溢出。


通过查找资料发现还有一种方法交换两个整数的方法,同样也是不使用中间变量,使用使用异或操作(相同位为0,不同位为1),代码如下:


void swap3 (int& x,int& y)
{
             x ^= y;
             y ^= x;
             x ^= y;
}


讨论了以上不同的情况的代码,下面将上述代码进行整理,使代码的跟完美:


void swap4 (int &x,int &y)
{
             if(x==y)
             	return ;

             if((x>0&&y>0)||(x<0&&y<0)) 
	     {
	             x=x-y;
		     y=x+y;
             	     x=y-x;
             }
             else
            {
             x=x+y;
             y=x-y;
             x=x-y;
             }
}

void swap5 (int &x,int &y)
{
             if(x==y)
             <span style="white-space:pre">	</span>return;

             x^=y;
             y^=x;
             x^=y;
}


参考资料
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值