找到大于n的2的最小幂

时间:2013-01-12 07:11:09

标签: c algorithm bit-manipulation

我遇到了一段代码,用于找到比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中打印数字,但它没有多大意义。它背后的逻辑是什么?

3 个答案:

答案 0 :(得分:3)

这段代码用二进制n填充给定数字1的所有最低有效位,然后将结果增加1,从而实现所请求的结果。例如,对于输入101,位操作将产生111,并且在增加1之后它将变为1000(8),这实际上是2的更大功率然后101(5)。

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

答案 1 :(得分:3)

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

  • 第一行只是以与1相同的方式对待0(以一种有点令人困惑的方式写)
  • 第二行占据“或等于”,如果数字恰好是2的幂,我们会缩短一点。
  • 接下来的几行确保所有低位都设置为1.首先我们向右移动1并做一个逻辑或。结果是现在最高位和紧接在下面的位被设置为1.现在使用2的移位做同样的操作会使前4位变为1,依此类推。
  • 最后我们有一个比2的幂小1的数字,我们只加1。

答案 2 :(得分:0)

除了icepack的答案之外:正如here所述,该算法计算1 << (floor(log_2(n - 1)) + 1)