rol 循环左移 计算_如何计算2 * 8?100%的面试官都想要这样的答案

作者 | Java圣斗士 | 原创图文,转载请注明出处

全文1279字,阅读需要 8 分钟

85c7f8337af0672e86243bac84f32fda.png

哈喽,小伙伴们大家周末过的好吗?关注我,Java圣斗士每天带你飞!

今天,圣斗士带来了一道面试题,或许很多在技术圈的老鸟已经知道了这个知识点,但是今天的面向对象是初入IT圈的技术小白,以及那些对二进制不是很了解的小伙伴

那么今天的技术话题是——移位运算,一起来看看吧。

在很久很久以前,国内Java技术市场刚刚形成的时候,这道面试题就已经出现了。

问:如何更高效的计算 2 * 8 ?

4142b0864808b7f4794fca4e38e391e0.png

有些小伙伴可能就会问了,这2 * 8有什么好高效的呢?原来啊,在Java中,提供了一些位运算,这些位运算可以直接操作二进制来完成某些计算,效率是非常高的。

比如经常有面试官会问到,为什么在重写hashCode()方法的时候,要以31作为质数(prime)?

或许你每次重写hashCode和equals的时候都是通过IDE自动生成的,又或者你还从未重写过这两个方法,那么你就真的需要认真思考一下了。

5bb5a6603a099caecea4dfa46c6f050e.png

在hashCode()方法中:

@Overridepublic int hashCode() {final int prime = 31;int result = 1;result = prime * result + ((name == null) ? 0 : name.hashCode());return result;}

我们之所以用31这个质数来作为乘数,是因为底层JVM可以自动进行优化,将上述代码中的prime * result 优化为:(result << 5) - result从而获得更好的性能。

这里就出现了移位运算 << ,它的含义是左移,上面的代码 << 5 ,代表result所表示的二进制数左移 5 位。接下来我们就来聊一聊移位运算的规则。

首先移位运算需要在二进制的层面上进行描述,因此,我们需要将需要移位的数以二进制形式来表示(注意,二进制表示并不代表要用代码写出二进制,Java是不支持二进制数字的书写的)。

ffe0a290669cc80cf9aa8392ea45db5c.png

比如19这个数,它的二进制表示是:

10011

那么19 << 2,那么原来的数字就变成:

1001100

这个数字的10进制代表76,正好是19 的4倍,即2 的2次方,而且这不是巧合!我们将一个数字进行左移的时候,低位(右边的位,高位则代表左边的位)会以0补位,每补一个0,就代表乘2(就好比在十进制中,1后面补一个0代表乘10一样)。所以,<< 2 就代表左移 2 位,补两个0,代表乘两次2。

那么如此一来左移的规则就是:

num << n 等于 num 乘以 2的n次方

(抱歉,实在不知道n次方怎么打出来)

edeea9f03d9aad61ba7a314b754780dd.png

那么我们再回到一开始的问题:如何更高效的计算 2 * 8?

经过上面的讨论,8是2 的3次方,于是,我们就可以写做: 2 << 3 。这道题的引导性太强,有些面试题可能很隐蔽地在考察你移位运算,如果你能够通过移位运算来提升乘法运算的性能,相信面试官一定会对你刮目相看的。

你学会了吗?!

30a4bd9f06e72c2dc37728f2be127250.png

往期精彩:

《对话式情景剖析,String被final修饰的真正原因!一篇足矣》

《处理集合还是只会for循环?那你该了解了解Stream API了》

《Java如何处理JSON数据?一篇Jackson教你快速入门》

《SpringBoot一键启动做了哪些工作?不想面试被血虐的来看看吧》

《再不了解一下volatile你就out了》

---欢迎关注【Java圣斗士】,我是你们的小可爱(✪ω✪) Morty---

---专注IT职场经验、IT技术分享的灵魂写手---

---每天带你领略IT的魅力---

---期待与您陪伴!---

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值