我遇到了一段代码,用于找到比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中打印数字,但它没有多大意义。它背后的逻辑是什么?
答案 0 :(得分:3)
这段代码用二进制n
填充给定数字1
的所有最低有效位,然后将结果增加1
,从而实现所请求的结果。例如,对于输入101
,位操作将产生111
,并且在增加1
之后它将变为1000
(8),这实际上是2的更大功率然后101
(5)。
更新:实际上,这是对手动设置每个lsb位的简单方法的优化。为什么这种优化能够达到相同的结果,这是一个不同的问题,范围更广,超出了这个问题。
答案 1 :(得分:3)
实际上,它发现2的最小幂大于或等于n
,它适用于32位无符号数。
答案 2 :(得分:0)
除了icepack的答案之外:正如here所述,该算法计算1 << (floor(log_2(n - 1)) + 1)
。