/**
* Returns a power of two size for the given target capacity.
*/
static final int tableSizeFor(int cap) {
int n = cap - 1;
n |= n >>> 1;
n |= n >>> 2;
n |= n >>> 4;
n |= n >>> 8;
n |= n >>> 16;
return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
}
趁着周五下班前的一点时间我又复习了一遍HashMap的源码
注意到了这个位运算方法,这个算法的目的是求出大于等于给定数字的最小二次幂。之前好像群里有人把这道题提到leetcode上去了,今天看到了就了解了一下。
第一眼看上去,很神奇,怎么就几个位运算就求出了最小二次幂呢。。。。
然后思考。。。不得其解,与群友讨论,有人给出了简略答案,答案我都看了好几遍才看懂。。。
首先我们只看五次位运算:
n |= n >>> 1;
n |= n >>> 2;
n |= n >>> 4;
n |= n >>> 8;
n |= n >>> 16;