Java位移分享(一)
最近在看HashMap源码时(构造器那块代码),看到了一段代码,如下:
static final int tableSizeFor(int cap) {
int n = cap - 1;
n |= n >>> 1;
n |= n >>> 2;
n |= n >>> 4;
n |= n >>> 8;
n |= n >>> 16;
return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
}
老实说,我是N脸懵逼的,所以百度外加自己demo测试,勉强算是理解了一部分,在此记录下。
1. 左位移运算符 <<
int a = 124;
a = a << 1;
124 的二进制是: 0111 1100
左移1位后的二进制是: 1111 1000
整体左移1位,也就是舍弃右边第1位,之后在末尾补0,换算为十进制,结果是248 。
2. 右位移运算符 >>
int a = 124;
a = a >> 1;
124 的二进制是: 0111 1100
右移1位后的二进制是: 0011 1110
整体右移1位,也就是舍弃末尾1位,在最右侧补1个0,换算为十进制,结果是62。
3. 无符号右移运算符 >>> (不保留符号)
这个相对前两个稍微麻烦点,首先你需要了解如何使用二进制来表示负数:
如 -1 ,用二进制的标识方式是: 11111111 11111111 11111111 11111111
这串1是怎么来的我就不展开说了,具体规则就是 这个负数的,绝对值的,二进制码,取反加1。
绝对值:-1的绝对值是1 , 1的二进制码是: 00000000 00000000 00000000 00000001
取反 : 11111111 11111111 11111111 111111110(把0转为1就好)
加1 : 11111111 11111111 11111111 111111111(末尾加1)
那么 -1 的二进制码就得到了。
那么具体以 -14 >>> 2 来演示:
-14 的绝对值是 14
14 的二进制码是: 00000000 00000000 00000000 00001110
取反 : 11111111 11111111 11111111 11110001
加1 : 11111111 11111111 11111111 11110010
右移2位:00111111 11111111 11111111 11111100
转换为10进制 : 1073741820