我为什么不喜欢用异或做两数值的交换

大家在初学编程的过程中,肯定会学习到使用代码去交换两元素的值

虽然已经过去了很久,但笔者对当时老师上课所讲的话记忆犹新:

“交换两个值,就像是把醋瓶子里的酒装入酒罐,把酒罐子里的醋倒入醋瓶。

要完成此任务,就要多找一个空瓶子,作为两者的交换的暂存罐”

同理,代入代码中,我们可以多定义一个变量,作为数值的“暂存罐”

int a = 5;
int b = 3;
int tmp;

tmp = a;
a = b;
b = tmp;

浅显易懂,且十分符合我们作为初学者的正常思维逻辑


慢慢地,学到后来,笔者发现不少书籍以异或交换两元素值为荣

(让读者不能直接看懂代码的内容以彰显本书的高大上), ps: 这只是笔者的主观想法。

而我们,也是无脑的跟着学,而十分简单的交换运算自此也变得花里胡哨起来:

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

......

在我当初的心中,假若别人第一眼无法看懂自己的代码,那么就可以凸显自己代码的高深莫测

仅仅在交换两值上,就下了不少的功夫

我懂你们不懂的,我能写出你们看不懂的

美其名曰为了面试拓展自己的代码风格,殊不知一大半都是自己的优越感与装逼的欲望在作祟


举个简单的例子:

    对于吃饭,有的人用勺子吃,有的人用筷子吃,这本再正常不过。然后突然冒出来一个二逼,

用一支筷子,以一种离奇且不可描述的方式,也吃到了饭:你们这群low逼,看我用一支筷子就吃

到饭了,还节约使用了一支筷子......然后,原本正常吃饭的人也统统学习这个吃饭方式,生怕自己被落下


在此笔者不禁问一句:有意思吗? 或者说,有意义吗?

有没有意思这个取决于个人,但意义,真的不大


使用勺子,使用一双筷子,别人看到自然会想到这个人在吃饭

而倘若你用一支筷子,别人只会认为你瞎闹着玩,更不会明白原来你在吃饭

代入编程中,这是代码的清晰度与否的问题


况且,用异或来交换两元素的值,也未必就比使用暂存变量交换更快

我们总是理所当然得认为位运算会快一些,所以只要是有关位运算,我们总认为其效率高

更何况是交换两值如此简单的运算......

话不多说,直接上图。为了具有一般性,笔者给运算加上了循环(代替了多次运行程序以求平均值),

这是笔者用自己的电脑多次运行程序之后,对结果取的适中的值:

  这是异或运算:


所以,无论是以代码的清晰度来书,还是程序运行的效率,我们都有理由选择要一个“暂存罐”


使用异或交换两元素值是众多“用一支筷子的吃饭”的一例。希望大家在阅读我的文之后,在面对着

那些炫耀着以一只筷子吃饭的时候,能保持一个客观清醒的态度并坚持使用自己的勺子(一对儿筷子),

毕竟,这都什么年代了,又不是缺那一支筷子.......

(当然,假若你实在穷的没有多余的筷子了,不如将异或运算改为加减运算吧,因为如果两数值相同的话,异或结果是为0的。我们再顺带把暂存罐也扔了)

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

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值