关于&(位和)运算符

时间:2017-07-19 03:35:40

标签: java algorithm math

我在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的幂)

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%lengthx的有效数字n {1}}

所以legnth - 1确实是111..111x数字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

的模运算