【问题标题】:Finding the smallest power of 2 greater than n [closed]找到大于 n 的 2 的最小幂 [关闭]
【发布时间】:2013-01-12 07:11:09
【问题描述】:

我遇到了一段代码,用于查找大于 32 位整数 n 的 2 的最小幂...

n+=(n==0);
n--;
n|=n>>1;
n|=n>>2;
n|=n>>4;
n|=n>>8;
n|=n>>16;
n++;

现在它是如何工作的?我尝试在 n=100 的每一步之后以 base-2 打印数字,但这没有多大意义。其背后的逻辑是什么?

【问题讨论】:

  • 我以为这是一个 32 位整数?
  • 它仅适用于 32 位 uint。顺便说一句,有 same question:如果 nextpow2 是 2 的幂 (x & ( x – 1) == 0),则 nextpow2 是相同的数字,否则是 msb << 1
  • @WhozCraig 是的。抱歉,我编辑了问题。

标签: c algorithm bit-manipulation


【解决方案1】:

这段代码用二进制1s 填充给定数字n 的所有最低有效位,然后将结果增加1,达到要求的结果。例如,对于输入101,位操作将产生111,在增加1 后,它将变为1000(8),这确实是比101(5) 大2 的最小幂。

更新:实际上,这是对手动设置每个 lsb 位的简单方法的优化。为什么这种优化能达到相同的结果是一个不同的问题,范围更广,超出了这个问题。

【讨论】:

    【解决方案2】:

    实际上它会找到大于或等于n 的 2 的最小幂,它适用于 32 位无符号数。

    • 第一行只是将 0 视为 1 相同的方式(写法有点混乱)
    • 第二行表示“或等于”,如果一个数字正好是 2 的幂,我们将其缩短一点。
    • 接下来的几行确保所有低位都设置为 1。首先我们右移 1 并执行逻辑或。效果是现在最高位和紧随其后的位设置为 1。现在通过移位 2 执行相同操作,使最高 4 位变为 1,依此类推。
    • 最后我们得到了一个小于 2 的幂的数字,我们只需加 1。

    【讨论】:

      【解决方案3】:

      对 icepack 的回答进行补充:正如 here 所解释的,算法计算 1 << (floor(log_2(n - 1)) + 1)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-06
        • 1970-01-01
        • 2018-01-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多