位运算&的取余操作

  • 在看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
...

1的个数就是移出去的位数

  • 现在就明确了 用 k&(2的n次幂-1) 可以实现取余操作
 11%4=3 
=11 &4-1=1011 &0100 - 1//用二进制表示
=1011 & 0011
=0011
=3
  11 >> 2
=1001 >> 2
=10 | 11
=23

猜你喜欢

转载自blog.csdn.net/weixin_45583648/article/details/106300998