你的一键三连是我巨大的动力!
即熟悉又陌生的位移运算操作,熟悉是指源码或者面试中总有它的身影,陌生是指开发中你可能不常用 或者可能压根不知道怎么用,看不起谁呢?
看过 ArrayList 源码的小伙伴,对这一行代码一定不陌生,ArrayList一旦在添加时,不够实际容量就以1.5倍扩容,便是这一行代码。
将这行代码用文字描述就是,实际容量向右位移1得到它自身容量一半,再加上它自身刚好是它的1.5倍。
如果你觉得有点绕,没事,把这一篇轻松看完,相信你以后再次碰到这类源码,都会行云流水般畅快。
左移右移位运算符其实相当简单!
一、先搞懂二进制
首先知道二进制如何转十进制,这里用十进制 55,转成二进制就是这样 0011 0111。
(没错,十进制在二进制的世界里只有 0 1 )
那怎么从二进制回到十进制呢?
找规律,两个步骤!
- 找 1 的数字
- 看数字 1 的位置
- 将数相加
先看步骤1,二进制中,1个数字对应一个为 2的数字;步骤2,1的位置代表着2的几次方。
从第一个数字1 开始,
2
0
2^{0}
20 = 1,第二个
2
1
2^{1}
21 = 2 …以此类推,最后相加。
二、搞懂左移右移位运算符
2.1左移位运算符
左位运算符 箭头往左的,没错,我知道你可能容易弄错,这不,细心的我已经帮你安排得明明白白。
【被右移数】 << 【右移几位】
左移几位相当于原有二进制基础上往左推进几位,如果是正数情况下就是推进几个 0
左移相当于乘,每向左移1位,相当于 * 2
55 * 4 = 220
不管左移还是右移改变的是1的位置,可以看到图中,第一个1因为左移2位,改变为 2 2 2^{2} 22 以此类推…而如果想要快速算出 十进制左移 2位也非常简单。
首先一样,懂得找规律,图中左移2位相当于 2 2 2^{2} 22 = 4,从规律可以看出
以此类推,假设再左移3位,那么
2
3
2^{3}
23 = 8,55 * 8 = 440
我们上面所演示都是正数情况下跟负数情况下右上面区别呢?
就是就是
2.1右移位运算符
事物总是会有两面,有左就会有右,会一键三连且聪明的你应该早就想到,事物的对立面一定是相反的!
这绝对是当然没错的!
右移位运算符,箭头是往右
【被右移数】 >> 【右移几位】
右移几位相当于原有二进制基础上往右推进几位
右移相当于除,每向右移1位,相当于 / 2
如图,跟55 / 4 =13 是一样的。
三、回到开头的那行代码
看完了左右位移,是不是发现贼简单,回到开头的那行代码,实际容量右移1(其实就是除以2嘛),相当于实际容量除以2,也就是它实际容量一半。
假设是实际容量为 10 >> 1,就是实际容量10/2=5,再次加上它自身容量15,就达到所谓每次容量不够以1.5倍扩容。
最后
我是一颗剽悍的种子 把我会的,认真的分享 是我写博客一直不变的信条
用有限的生命去学无限的知识注定是失败,所以我会用有限的时间,尽可能输出最有价值的知识谢谢能遇见可爱又一键三连的你。