Photo by
allison christine
on
Unsplash
Hello,大家好,我是鸭血粉丝,最近阿粉所在的公司来了一位应届大学生来实习,前面都不是重点,重点是这个大学生是个妹子!!!
大家都知道的,在这个狼多肉少的 IT 行业里,能够遇到一位程序媛,都是想着和妹子搭搭话。
阿粉也想和妹子搭搭话,但是有些木讷的我不知道和妹子聊啥。突然想到妹子不是个应届生嘛,肯定有些知识是不基础的,这不今天早上阿粉的装逼机会就来了。
阿粉:小兰啊(这是那个妹子的名字),假设现在 x = 4 , y = 1 ,现在让 x 和 y 的值互换一下,也就是 x = 1 , y = 4 ,你会用什么方法来实现呢?
小兰:吼,小哥哥你是看不起我嘛?这么简单的题我还是会的,来个中间变量 temp ,然后:
temp = x; x = y; y = temp;
这样就让 x 和 y 的值互换了,我是不是很聪明
阿粉:你这样实现是没错,但是借助了中间变量呀,如果我不让使用中间变量来实现呢?
看到妹子陷入了思考之中,我在心里开始得意的笑,哈哈哈
但是没想到妹子两分钟就给出了解决方案:
x = x + y; y = x - y; x = x - y;
,嗯,这个小姑娘确实可以,但是阿粉有更好的方法,要不怎么在妹子面前装逼呢
阿粉:这个方法很棒,没有借助中间变量就实现了。还有没有其他方法呢?可以显得高大上那种?
只见妹子抓耳挠腮了很久,还是没想出来。这个时候暖男阿粉就出手了
阿粉:其实还有一种方法实现,那就是使用 异或 。还是以这个题为例,我这样写也可以达到目的:
x = x^y; y = x^y; x=x^y;
小兰:我读书少,你可别骗我啊,这三行代码除了前面 x,y 不一样之外,后面的内容是完全一样的嘛,这怎么就互换了呢?
阿粉:那我问你啊,什么是异或呢?
小兰:这个我清楚,异或的意思就是,如果两个值相同,那异或之后的结果就是 0 ,如果两个值不同,那异或之后的结果就是 1 。如果一个值和 0 异或,那么结果还是原来的值。
阿粉:完全正解!那你看一下这几行代码,我先让
x = x^y
,然后
y = x^y
,此时的 y 是不是就是
y = x^y^y
,你刚才不是说,两个值相同的话,异或之后的结果就是 0 ,那 y 是不是就等于 x 了?
小兰:哈,还真是啊。最后一个
x = x^y
就是
x = x^x^y
也就是 x = y 了。这样就实现了两个值互换了
阿粉:对,是这个样子的。为了检测一下你是不是真的学到了,我再给你出个题吧,这个题目在 LeetCode 上也算是一个经典题目了,怎么样,要不要挑战一下?
小兰:当然要挑战了!
阿粉:好,现在有一个非空数组,除了某个元素会出现一次之外,其他元素都会出现两次,比如数组
[4,1,2,1,2]
那程序运行结果就是 4 。在你实现的时候呢,有个要求,就是不准使用额外空间,就把这个需求给实现。
小兰:嗯,既然是检验我是否掌握了异或位运算,那应该就是用它来实现了。
小兰:哈,小哥哥,我实现出来咯,你看,我是这么写的代码:
public static int singleNumber(int[] nums){
int complete = 0;
for (int num : nums){
complete ^= num;
}
return complete;
}
阿粉:哎呦,这波操作可真是亮瞎了我的眼
小兰:哈哈,以前只是学理论,没想到在编程中应用是这么好玩。我再去学习一下其他的逻辑运算符
阿粉:嗯,小姑娘很棒哈,知道自己这里是薄弱之处,就会把相同的知识点一起学习一下,这样的学习效率很高,给你点赞。
小兰:如果我在学习过程中,遇到不会的,可以继续请教小哥哥嘛?到时候不要嫌弃我。
阿粉:怎么会嫌弃呢,乐意之至。只要你遇到问题,随时来找我。(暖男要暖到底不是)
小兰:我就先谢过小哥哥啦,大早上的就让我学到了新知识。该去工作了,小哥哥回来聊啊~
阿粉:回来聊,回来聊~
妹子都学会了的异或运算,各位看官学会了嘛?学会的点个赞,让我看到你。
现在阿粉诚邀你加入我们的知识星球,这里有 1700+ 优秀的人与你一起进步,如果你是小白那你是稳赚了,很多业内经验和干货分享给你;如果你是大佬,那可以进来我们一起交流分享你的经验,说不定日后我们还可以有合作,给你的人生多一个可能。