位运算&的取余操作

  • 在看HashMap源码的时候,用hash码判断哈希桶的位置,用的是&位运算符取余的操作 i = (n - 1) & hash,这里的n是哈希桶的个数,i是桶的位置。
if ((tab = table) == null || (n = tab.length) == 0)
            n = (tab = resize()).length;
if ((p = tab[i = (n - 1) & hash]) == null)
            tab[i] = newNode(hash, key, value, null);
  • 首先用&取余是有限制条件的:
    除数必须是2的n次幂才行
    所以java规定了默认初始容量必须是2的幂次。
/**
* The default initial capacity - MUST be a power of two.
*/
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16

对于一个数k要除以2的n次方,也就是相当于把k向右移n位,而被移出去的n位即正好是我们要求的余数。

2的二进制减1是	0001
4的二进制减1是	0011
8的二进制减1是	0111
16的二进制减1是  1111
...

现在就明确了 用 k&(2的n次幂-1) 可以实现取余操作

 11%4=3 
=11 &4-1=1011 &0100 - 1//用二进制表示
=1011 & 0011
=0011
=3
11 除以 4
=11 >> 2
=1011 >> 2
=10 | 11
=23
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值