有一个java代码:
private static final int tableSizeFor(int c) {
int n = c - 1;
n |= n >>> 1;
n |= n >>> 2;
n |= n >>> 4;
n |= n >>> 8;
n |= n >>> 16;
return (n < 0) ? 1 : (n >= Integer.MAX_VALUE) ? Integer.MAX_VALUE : n + 1;
}
结果是:min(次数2和&gt; = c)
例如,如果c为5,则结果为8,如果c为16,则结果为16。
我已计算出算法显示,但我不知道如何理解这个算法,任何人都可以清楚地解释这一点,谢谢。
答案 0 :(得分:0)
这是寻找两个&gt; = c。
的幂通过填写最高1以下的所有1来完成此操作。 101010变成111111,然后在末尾加1,使其成为1000000,即。 2的力量。
首先减去1,使2的幂保持不变。
根据定义,我不确定为什么n >= Integer.MAX_VALUE
检查int
不能是>
而不是MAX_VALUE。也许这段代码最初是使用long n
从算法复制的。
注意n > 1 << 30
哪里会过度流动并产生1
而不是MAX_VALUE。