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