求余数的快捷算法
在看HashMap的实现中看到了一个求取余数的快速算法,
//求出h对length取余数,length必须为2^N次方
static int indexFor(int h, int length) {
return h & (length-1);
}
而HashMap实现的table的length就必须是2^N次方,所以可以采用此算法
原理
2^1 = 10
2^2 = 100
2^3 = 1000
2^n = 1(n个零)
而2^n - 1 是:
2^1 -1 = 01
2^2 -1 = 011
2^3 -1 = 0111
2^n -1 = 0(n个1)
那么,我们可以发现,当 length = 2^n 的时候, m & (length -1)的结果,就是 0 ~ (length -1) 之间的数值,就是相当于 m % length 的结果,而当length != 2^n 的时候,这个特点不成立。
原理复制自http://yananay.iteye.com/blog/910460