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

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

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

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

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

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;

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

  1. 我为什么喜欢用C#来做并发编程

    题记:就语言和运行时层面,C#做并发编程一点都不弱,缺的是生态和社区. 硅谷才女朱赟(我的家门)昨天发了一篇文章<为什么用 Java -- 关于并发编程>,让大家学习了Java中如何进行并 ...

  2. 什么意思是谁_舔狗是什么意思?如果不是真的喜欢谁又愿意做舔狗呢出处?

    [海峡网] 网络上面经常会出现一些新的词句,比如最近舔狗这个词就经常出现在大家的视线中.相信很多小伙伴都知道,最近关于虎牙的包子的事情也是挺多的,不过关于包桑的梗也是很多,那么关于包桑的这句" ...

  3. 喜欢这样静静地做自己喜欢的事情

    窗外月光如水,喧嚣了一天的城市在月光的寂静中安然入眠.此时夜静心也静下来.望望窗外,树影婆娑,如丝如缕的风轻轻吹来,感觉一阵子的畅快.再瞧瞧屋内一盏橘×××的台灯,照着一屋的安静,桌上一杯淡淡的茉莉花 ...

  4. 外科医生最喜欢给什么人做手术

    1 四个外科医生围坐在一起,谈论他们喜欢为何种人做手术.   第一个医生说:'我最喜欢为图书管理员做手术.当你打开他们的身体时,里面的一切东西都是按字母顺序排的.   第二个医生说:'我最喜欢为会计做 ...

  5. 手机被偷前必做两件事

    [转载:http://www.williamlong.info/archives/4765.html] 很多"专家"都曾经发过<手机被偷后必做的N件事>这类教程,比如: ...

  6. java 不用中间变量_java异或运算不使用中间变量交换两个数(Java版)详细分解...

    Java的异或运算^,这个小不点"^"就是Java的异或运算符,其特性如下:真^假=真假^真=真 假^假=假 真^真=假,它却是说明了Java异或运算的基本法则,那就是:只要两个条 ...

  7. 【异或交换原理】按位进行异或操作,实现数的交换

    用按位异或来交换数原理是什么? 比如, int x=7,y=8; x=x^y; y=x^y; x=x^y; 结果x=8,y=7; 那么,你写的例子就是利用异或的方法将两个数交换,就如同: int x= ...

  8. 双十一大促技术只做两件事情?来看看阿里巴巴的技术之道

    作为国内互联网技术的典型代表,阿里巴巴的技术一直备受关注 编者按:本文来自微信公众号"InfoQ"(ID:infoqchina),36氪经授权发布. 支付宝的高可用与容灾架构演进 ...

  9. 实现两个数的交换(异或,加减)

    1. 通常我们通过设置临时变量来实现两个数的交换,如下: void swap(int *a,int *b){int temp;temp=*a;*a=*b;*b=temp;} 2.还可以通过异或来实现两 ...

最新文章

  1. Win10系列:VC++调用自定义组件1
  2. LINUX系统以及ANDROID 平台log信息输出级别设置 [MTK]
  3. 音视频(H264+G711)打包AVI文件
  4. 【技术干货】Spring事务原理一探
  5. 【PHP】字符串-访问子串
  6. centos7安装mysql主从_centos7 安装mysql 和主从复制
  7. 基于PYNQ-Z2的手写数字识别卷积加速器设计【持续更新】
  8. armbian 斐讯n1_斐讯N1刷Armbian Linux做服务器
  9. mysql 1698 错误
  10. 解决谷歌浏览器flash插件已被屏蔽
  11. 2019 AI顶会时间表
  12. poi根据模版生成多页word,并压缩下载
  13. 电脑硬件常见故障维修技巧
  14. 数据库——概念模型(CDM)、逻辑模型(LDM)、物理模型(PDM)
  15. 培训班出来的程序员怎么就不行了?
  16. bzoj 1779: [Usaco2010 Hol]Cowwar 奶牛战争 (网络流)
  17. 吉吉国王(树形dp)
  18. 组态软件的开发(C#)
  19. 做人要低调,绝对经典的低调
  20. rsa 长密钥实现及测试

热门文章

  1. python中demo函数是什么意思_Python函数(中)
  2. 开源一个服务端游戏开发框架
  3. 西班牙航行家眼中的明朝中国
  4. URL, URI, URN 和 IRI 表示的意思
  5. Discuz!NT 代码阅读笔记(8)--DNT的几个分页存储过程解析
  6. 机器学习日记(13)
  7. springboot毕设项目在线智能办公系统bxl9i(java+VUE+Mybatis+Maven+Mysql)
  8. 达内python培训课程
  9. 渲染单色_均质单色ui设计有什么问题
  10. win10电脑怎么设置最佳性能?