求余数的快捷算法

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

Published: July 29 2012