交换两个变量的值的n种写法

汗,不用猜我有多无聊,猜中没奖。。。。我也那么觉得的 大笑

        有天晚上突然想起我们老师说交换两个变量的值只能引入一个中间变量,就好奇,百度了好久,总算在看完三页百度之后感觉似乎真的再也找不到别的方法了,谢谢各位神奇的网友满足了我的好奇心~这里加上些自己的观点。


int a=1, b=10;

第一种:传统方法是引入一个变量;1
int c;
c = a;
a = b;
b = a;
这种方法实际上几乎是最快的,仅仅三条mov指令。不过实际上这个比较速度没什么意义,就是不同的花式,让大家看看而已。这个方法也是最好的,适用于所有情况。

第二种:按位异或运算(一种分开三条语句,两种合并为一条语句);3

a = a ^ b;//  a^=b  //     a1=a^b;
b = b ^ a;//  b^=a  //     b=b^a1=b^a^b=a;
a = a ^ b;//  a^=b  //     a=a1^a=a^b^a=b;

这个嘛~~异或只能用于整型值(应该是所有整形值)~而且有人说位运算快,比引入变量快。唔,先不说mov指令与xor指令的速度(感觉一样~吧),但这里可是三个xor指令+三个mov指令。

对于C++玩家来说,是可以写成这样的a ^=b ^=a ^=b,但是如果是java的话,这样只能得出一个数的值(交换后的),另一个值变为零。

另外一种合并方式是a=b^a^(b=a);这样写,不管对于C++还是java都是可以成功的。


第三种:加减法(这种写法同样能把三条语句合在一起);2

a = a + b;
b = a - b;
a = a - b;
这种方法适用于所有的整形值,不用担心数据溢出,数据溢出的影响会在啊后面被中和掉。对于浮点型数据,有时在精度上会出问题,当然只是有时,而且还是可以采取比如格式化或者其他保留小数位的方法解决(多麻烦啊~ 尴尬)。

a = a + b- (b = a);//等效


第四种:乘除法(这种写法同样能把三条语句合在一起);2

a = a * b;
b = a / b;
a = a / b;
汗~对它的评价如上(其实这个跟上面那个没什么区别,加减互逆,乘除互逆),唯一有所不同的只是速度,乘除法的速度慢于加减法~而且,a,b不能为零~
a = a * b/ (b = a);//等效

其他:这里有两种,汗~就让我再水一水吧;2

a=b | (b=a)*0;(这个 | 可以换成任何符号)
这种写法在java里是成立的,但是在C++里不成立,唔,应该是对赋值后(但语句未结束时)的处理状况不同吧。
还看到一种是说用栈(先进后出的特性),我那个汗啊~~


结束了~~其实还有点就是想把找来的东西整理整理,记下来。借用一个学长的话,这些其他写法都是装逼~最好的就是使用中间变量(咳咳,我还是挺想装装的,还能少写几句话~)。看到说有的面试题会这样问,交换两个变量的值(给你一些限制条件)~好水的感觉。。。。

附:int a=1;     java:a=a++;(输出a的值为1)     C++:a=a++;(输出a的值为2)【这是我在一篇文章上看到的,也确实是这样,处理的方式不一样,那篇文章的名字倒是忘记了~】

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值