她理财

登录 注册
#2016上半年盘点

来自综合理财・140篇帖子・2109人参与

发帖
用户已注销

交换两个数

用户已注销
用户已注销 用户已注销 2019-05-16 18:23 阅读(713)

交换两个数相信很多人天天写过,我也相信你每次都会使用一个额外来变量来辅助交换,例如,我们要交换 x 与 y 值,传统代码如下:

int tmp = x; x = y; y = tmp; 复制代码

这样写有问题吗?没问题,通俗易懂,万一哪天有人要为难你,**不允许你使用额外的辅助变量来完成交换呢?**你还别说,有人面试确实被问过,这个时候,位运算大法就来了。代码如下:

x = x ^ y   // (1) y = x ^ y   // (2) x = x ^ y   // (3) 复制代码

我靠,牛逼!三个都是 x ^ y,就莫名交换成功了。在此我解释下吧,我们知道,两个相同的数异或之后结果会等于 0,即 n ^ n = 0。并且任何数与 0 异或等于它本身,即 n ^ 0 = n。所以,解释如下:

把(1)中的 x 带入 (2)中的 x,有

y = x^y = (x^y)^y = x^(y^y) = x^0 = x。 x 的值成功赋给了 y。

对于(3),推导如下:

x = x^y = (x^y)^x = (x^x)^y = 0^y = y。

这里解释一下,异或运算支持运算的交换律和结合律哦。

以后你要是别人看不懂你的代码,逼格装高点,就可以在代码里面采用这样的公式来交换两个变量的值了,被打了不要找我。

讲这个呢,是想告诉你位运算的强大,让你以后能够更多着去利用位运算去解决一些问题,一时之间学不会也没事,看多了就学会了,不信?继续往下看,下面的这几道题,也是非常常见的,可能你之前也都做过。


作者:帅地
链接:https://juejin.im/post/5cdce78d5188250d8b2df3a7
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

只看楼主

还没有人回复,赶紧来抢沙发啦~

回复楼主

回帖
小组话题

扫码下载

APP

iOS • Android

想理财却无从下手? 打开应用
通俗实用的理财课程
0.292705059052