起因
前一段时间发表了一篇ArrayList源码分析,一位少年私信我:
:像这种(oldCapacity >> 1)是什么?
:我说是位运算,通过二进制右移来进行计算。
:少年的疑问涌上了心头,位移?
:不懂了吧。少年,那我就给你讲讲位运算吧!
远看庐山
:位运算一共有七种,分别是&,|,~,^,<<,>>,>>>
:少年些许得意:我高中时候在数学学过,后面是数学像比大小。远远大于,远远小于。
:我说那(oldCapacity >> 1)取得是boolean值了啊,那这样和源码逻辑相符么?
:少年有些犹豫,不符。
:对啊,这是二进制的运算,刚才已经说了这个前提。记住这几个符号,我们直接进入精彩部分。
庐山步行
第一景色
比如说:5&9,这个怎么求
1.首先要把它们转换为二进制。
5:00000101
9:00001001
:少年问我,那这个是怎么转化的?
:使用计算器啊,cmd-》calc啊。哈哈,不逗你玩了,我给你做个演示的过程。:同理9也可以得到。我们再看看如何计算的呢??
2.计算按位于
这时候我们就可以得到0000 0001,转换成十进制就是1
:那一是怎么得到的?
:我笑着说道:啊?因为1,所以1。算了,不逗你玩了。接下来看好了,别眨眼。
:少年喜悦表情流露而出:我懂了。
第二景色
我们继续通过9 | 5 进行分析。
:按位或是一个为1,就可以得到1。
:少年说我发现规律。只要记住这些规律,就可以运算。
:不错。我们下来再看看。
第三景色
:少年因为前几次的分析,已经渐生信心,谈到我来吧.
少年突然有些蒙圈,这个怎么算。大哥。
:操作数,就是一个数,对一个数取反。
:我懂了,那我来试试.
:对他们取反,得到1111 0110。把它转化为10进制得到246
:哈哈,不错。你说很对,少年。那我们在说说:按位异或
第四景色
:那我们继续以9和5为例
少年看看了,解了出来。竟嚣张到没有给我答案。好吧,读者们,你们自己根据规律,自行计算。
第五景色
:少年看到这个移位,忽然有些沉默。我便说道按5来说,转化二进制对他移位
会得到0001 0100。少年领会,便说,剩下的交给我了
第六景色
按5为例,向右移该怎么算,少年已经胜券在握,不愿意多言。那只能交给读者你们了
第七景色
以5为例,少年很快报出了答案,那剩下的只能交给读者们了。
庐山之上
站在庐山上面,很多人会感觉飘飘然,感觉位运算很简单,但切记:简单的东西要重复去做,才能把它变成本能。