对于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++;
答案 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的结果。