我在HashMap中看到这段代码:
/**
* Returns index for hash code h.
*/
static int indexFor(int h, int length) {
// assert Integer.bitCount(length) == 1 : "length must be a non-zero power of 2";
return h & (length-1);
}
HashMap有这个文件: 当长度是2的幂时,那么h& (长度-1)等于h%长度
我想知道数学的原理 只是为什么h& (长度-1)== h%长度(长度是2的幂)
答案 0 :(得分:1)
首先,当你取任何整数n
mod幂为2时,你可以想一下它的样子。
WLOG让2的幂是10000
二进制(实际上它必须是100...0
形式),它的倍数是什么样的?它的倍数必须看起来像...whatever digit...0000
。最后4位必须为零。
那么n mod 10000
是多少?设这个号码n
为...whatever digit...1011
。这个数字可以表示为...whatever digit...0000 + 1011
,现在很明显n mod 10000
确实只剩下最后4位数。
一般情况下,让length
为2的幂,其x
为零,n%length
为x
的有效数字n
{1}} 强>
所以legnth - 1
确实是111..111
(x
数字1),当您按位并且数字为n
时,x
个有效数字最少保留并返回n
,这是我们想要的。使用上面的相同例子,
Length = 10000, Length - 1 = 1111
n = 101001101 = 101000000 + 1101
=> n % Length = 1101
n & (Length - 1) = 1101
= n % Length
答案 1 :(得分:0)
想象一下:任何2的幂都包含单个位集并具有这样的二进制表示:
l = 00010000
如果你减去1,它将包含在正确位置的那些
m = l-1 = 00001111
使用任何h的二进制AND运算使所有最高有效位为零,留下不太重要的位
10101010 & 00001111 = 00001010
这相当于modulo l
的模运算