不使用临时变量交换两个变量的值

 

首先感谢小学妹兔子童鞋,这篇帖子的起源是她在上课时做的一个题~~~

----------------------------华丽丽的分割线-------------------------------------

问题:怎样不使用临时变量交互两个变量a和b的值?


这个问题其实有很多种解法,也是面试时常遇到的问题,下面给出它的不同解法

一、采用加减法,也是最常用的方法:

a = a + b

b = a - b

a = a - b

二、采用位运算法,速度快(同时带大家复习一下布尔逻辑运算符):

1.布尔逻辑运算符的复习

(1)按位与 &

&运算时若两个数相对应的位都为1(注意是二进制),则结果为1,否则为0。

运算法则:

0&0=0, 0&1=0,1&0=0,1&1=1;

举个例子吧

3&5 = 1

3:  0 1 1

5:1 0 1

----------

     0 0 1

按位与操作显然是1了......

记得今年淘宝的笔试有道题是这样的:

----统计1的个数求下面函数的返回值

 

x=9999

10011100001111 

答案:8

解析:x-1是将二进制最后一位数变成0,然后x&(x-1)是与之前的那个数按位与运算,很显然,9999转化成二进制8个1,循环了8次


(2)按位或 

 |运算只要任一表达式的一位为 1,则结果的该位为 1。否则,结果的该位为 0。

0&0=0, 0&1=1,1&0=1,1&1=1;

具体不解释了,和上面的大同小异......

(3)异或 ^

^运算的基本法则是相同则为假,不同则为真:

0&0=0, 0&1=1,1&0=1,1&1=0;

2.该题的解法

好了,主角^姗姗来迟了,本题的第二种解法位运算法采用的就是异或,位运算在效率上要比第一种方法高得多。

b = a^b

a = a^b

b = a^b

举个简单例子,设a=1,b=2

a=01^10 = 11

b=11^10 = 01 (1)

a=11^01 = 10 (2)

交换成功!

三、最简洁的方法

IT的确是人才辈出啊,刚刚又看到了一种高效简洁的方法

b = a + ((a = b) & 0)

好家伙,果然强大

解析:赋值符的运算级别低,可以看做这几步:

temp = a+0

a = b

b = temp

最后祝兔子童鞋明天生日快乐,这篇文章是送给她的生日礼物~~~~~~~~~

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值