我为什么不喜欢用异或做两数值的交换
大家在初学编程的过程中,肯定会学习到使用代码去交换两元素的值
虽然已经过去了很久,但笔者对当时老师上课所讲的话记忆犹新:
“交换两个值,就像是把醋瓶子里的酒装入酒罐,把酒罐子里的醋倒入醋瓶。
要完成此任务,就要多找一个空瓶子,作为两者的交换的暂存罐”
同理,代入代码中,我们可以多定义一个变量,作为数值的“暂存罐”
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;
我为什么不喜欢用异或做两数值的交换相关推荐
- 我为什么喜欢用C#来做并发编程
题记:就语言和运行时层面,C#做并发编程一点都不弱,缺的是生态和社区. 硅谷才女朱赟(我的家门)昨天发了一篇文章<为什么用 Java -- 关于并发编程>,让大家学习了Java中如何进行并 ...
- 什么意思是谁_舔狗是什么意思?如果不是真的喜欢谁又愿意做舔狗呢出处?
[海峡网] 网络上面经常会出现一些新的词句,比如最近舔狗这个词就经常出现在大家的视线中.相信很多小伙伴都知道,最近关于虎牙的包子的事情也是挺多的,不过关于包桑的梗也是很多,那么关于包桑的这句" ...
- 喜欢这样静静地做自己喜欢的事情
窗外月光如水,喧嚣了一天的城市在月光的寂静中安然入眠.此时夜静心也静下来.望望窗外,树影婆娑,如丝如缕的风轻轻吹来,感觉一阵子的畅快.再瞧瞧屋内一盏橘×××的台灯,照着一屋的安静,桌上一杯淡淡的茉莉花 ...
- 外科医生最喜欢给什么人做手术
1 四个外科医生围坐在一起,谈论他们喜欢为何种人做手术. 第一个医生说:'我最喜欢为图书管理员做手术.当你打开他们的身体时,里面的一切东西都是按字母顺序排的. 第二个医生说:'我最喜欢为会计做 ...
- 手机被偷前必做两件事
[转载:http://www.williamlong.info/archives/4765.html] 很多"专家"都曾经发过<手机被偷后必做的N件事>这类教程,比如: ...
- java 不用中间变量_java异或运算不使用中间变量交换两个数(Java版)详细分解...
Java的异或运算^,这个小不点"^"就是Java的异或运算符,其特性如下:真^假=真假^真=真 假^假=假 真^真=假,它却是说明了Java异或运算的基本法则,那就是:只要两个条 ...
- 【异或交换原理】按位进行异或操作,实现数的交换
用按位异或来交换数原理是什么? 比如, int x=7,y=8; x=x^y; y=x^y; x=x^y; 结果x=8,y=7; 那么,你写的例子就是利用异或的方法将两个数交换,就如同: int x= ...
- 双十一大促技术只做两件事情?来看看阿里巴巴的技术之道
作为国内互联网技术的典型代表,阿里巴巴的技术一直备受关注 编者按:本文来自微信公众号"InfoQ"(ID:infoqchina),36氪经授权发布. 支付宝的高可用与容灾架构演进 ...
- 实现两个数的交换(异或,加减)
1. 通常我们通过设置临时变量来实现两个数的交换,如下: void swap(int *a,int *b){int temp;temp=*a;*a=*b;*b=temp;} 2.还可以通过异或来实现两 ...
最新文章
- Win10系列:VC++调用自定义组件1
- LINUX系统以及ANDROID 平台log信息输出级别设置 [MTK]
- 音视频(H264+G711)打包AVI文件
- 【技术干货】Spring事务原理一探
- 【PHP】字符串-访问子串
- centos7安装mysql主从_centos7 安装mysql 和主从复制
- 基于PYNQ-Z2的手写数字识别卷积加速器设计【持续更新】
- armbian 斐讯n1_斐讯N1刷Armbian Linux做服务器
- mysql 1698 错误
- 解决谷歌浏览器flash插件已被屏蔽
- 2019 AI顶会时间表
- poi根据模版生成多页word,并压缩下载
- 电脑硬件常见故障维修技巧
- 数据库——概念模型(CDM)、逻辑模型(LDM)、物理模型(PDM)
- 培训班出来的程序员怎么就不行了?
- bzoj 1779: [Usaco2010 Hol]Cowwar 奶牛战争 (网络流)
- 吉吉国王(树形dp)
- 组态软件的开发(C#)
- 做人要低调,绝对经典的低调
- rsa 长密钥实现及测试