Java位移分享(一)

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

HashMap构造器中的tableSizeFor()方法,会在位移分享二中去说哈。 以上如有错误,还请大佬指正~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值