我靠这个知识撩到了公司的程序媛

进来瞅瞅阿粉的故事 故事是这样的:最近阿粉所在的公司来了一位应届大学生来实习,前面都不是重点,重点是这个大学生是个妹子!!!

大家都知道的,在这个狼多肉少的 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 。在你实现的时候呢,有个要求,就是不准使用额外空间,就把这个需求给实现。

小兰:嗯,既然是检验我是否掌握了异或位运算,那应该就是用它来实现了。

小兰:哈,小哥哥,我实现出来咯,你看,我是这么写的代码:

1
2
3
4
5
6
7
8
9
public static int singleNumber(int[] nums){
        int complete = 0;
		// 循环数组中的值
        for (int num : nums){
			// 当 complete 和 num 异或之后等于 num 本身时,说明这个数出现了一次
            complete ^= num;
        }
        return complete;
}

阿粉:哎呦,这波操作可真是亮瞎了我的眼

小兰:哈哈,以前只是学理论,没想到在编程中应用是这么好玩。我再去学习一下其他的逻辑运算符

阿粉:嗯,小姑娘很棒哈,知道自己这里是薄弱之处,就会把相同的知识点一起学习一下,这样的学习效率很高,给你点赞。

小兰:如果我在学习过程中,遇到不会的,可以继续请教小哥哥嘛?到时候不要嫌弃我。

阿粉:怎么会嫌弃呢,乐意之至。只要你遇到问题,随时来找我。(暖男要暖到底不是)

小兰:我就先谢过小哥哥啦,大早上的就让我学到了新知识。该去工作了,小哥哥回来聊啊~

阿粉:回来聊,回来聊~

妹子都学会了的异或运算,各位看官学会了嘛?学会的点个赞,让我看到你

Java Geek Tech wechat
欢迎订阅 Java 极客技术,这里分享关于 Java 的一切。