对于任何给定的数字,此代码如何工作以查找下一个最高2的幂

时间:2012-06-18 13:53:20

标签: c algorithm bit-manipulation

对于32位整数,此代码如何工作查找任意给定数字[> 1]的下一个最高幂2?

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

2 个答案:

答案 0 :(得分:7)

移位序列和按位序列保证一个由所有1 s组成的数字,它比2的幂小1。向它添加1会产生2的幂。

初始递减1是为了使n的值已经是2的幂。

(显然,如果n最初为0,则此代码无效。)

答案 1 :(得分:1)

递减将使情况2 ^ n给出结果2 ^ n而不是2 ^(n + 1)。它与最后的增量不对应。

递减和递增之间的部分实际上试图填充所有比当前最高有效位1更不重要的位。最高位为1将在每行之后逐渐传播并将填满所有较少的位最后一行的重要位。

增量是达到下一个最大功率2的结果。