为什么这个位操作会返回此结果?

时间:2016-01-06 07:00:36

标签: java algorithm bit

有一个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。

我已计算出算法显示,但我不知道如何理解这个算法,任何人都可以清楚地解释这一点,谢谢。

1 个答案:

答案 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。