h & (length-1)

当length总是2的n次方时,h& (length-1)运算等价于对length取模,也就是h%length,但是&比%具有更高的效率。

所以,为什么h& (length-1)运算等价于对length取模?

实现的原理如下:

X % 2^n = X & (2^n - 1)

假设n为3,则2^3 = 8,表示成2进制就是1000。2^3 -1 = 7 ,即0111。

此时X & (2^3 - 1) 就相当于取X的2进制的最后三位数。

位与( & )
1
2
3
4
5
public class Test {
public static void main(String[] args) {
System.out.println(5 & 3);//结果为1
}
}

5转换为二进制:0000 0000 0000 0000 0000 0000 0000 0101

3转换为二进制:0000 0000 0000 0000 0000 0000 0000 0011


1转换为二进制:0000 0000 0000 0000 0000 0000 0000 0001

位与:第一个操作数的第n位与第二个操作数的第n位如果都是1,那么结果的第n位也为1,否则为0

参考:https://www.jianshu.com/p/e910ff6a5579

https://blog.csdn.net/xiaochunyong/article/details/7748713