Java Integer.highestOneBit()方法解释

welcome to my blog

调用HashMap的put方法时, 如果table为空, 则会先创建一个大小为capacity的 Entry数组, 如果capacity的取值不是2的幂, 则会将其转换为2的幂, 具体就是使用highestOneBit(int i)方法实现的, 总体来说就是: 二进制形式下, capacity中最高位的1保持不变, 其余的1都置零
public static int highestOneBit(int i) {
    // HD, Figure 3-1
    i |= (i >>  1);
    i |= (i >>  2);
    i |= (i >>  4);
    i |= (i >>  8);
    i |= (i >> 16);
    return i - (i >>> 1);
}
return语句中的i有这么个特点: 从最高位的1到最低位, 都是1, 所以i>>>1之后原先的最高位变成了0, 那么i - (i>>>1)的结果只剩下最高位的1了, 返回该值;
那么问题来了, 为什么return语句中的i有这么个特点? 原因如下
i |= (i >> 1) 的作用:让最高位的1的下一位变成1, 现在最高位和次高位都是1
i |= (i >> 2) 的作用: 让最高位的两个1的接下来的两位变成1, 现在从最高位起, 往下连续4位都是1
i |= (i >> 4) 的作用: 让最高位的4个1的接下来的4位变成1, 现在从最高位起, 往下连续8位都是1
i |= (i >> 8) 的作用: 让最高位的8个1的接下来的8位变成1, 现在从最高位起, 往下连续16位都是1
i |= (i >> 16) 的作用: 让最高位的16个1的接下来的16位变成1, 现在从最高位起, 往下连续32位都是1
执行到这里, 从最高位的1到最低位, 都是1了, 那么i - (i>>>1)的结果只剩下最高位的1

具体的例子, capacity=18时, 其二进制形式为 10010

 i |= (i >>  1) 后变成 11011
 i |= (i >>  2) 后变成 11111
i |= (i >>  4) 后依然是11111
i |= (i >>  8 后依然是11111;
i |= (i >> 16) 后依然是11111

i-(i>>>1) 的结果是10000, 只剩下最高位的1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值