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

Gre*_*lin 4 c algorithm bit-manipulation

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

n--;
n = n | n>>1;
n = n | n>>2;
n = n | n>>4;
n = n | n>>8;
n = n | n>>16;
n++;
Run Code Online (Sandbox Code Playgroud)

Oli*_*rth 7

移位和按位序列保证一个由所有1s 组成的数,这比一个2的幂小1.向其中添加1可获得2的幂.

初始递减1是为了使其适用于n已经是2的幂的值.

(显然,如果n最初这个代码不起作用0.)

  • @hatchet它适用于1,与2,4相同.减少〜> 0; shift和`|`〜> 0; 增量〜> 1. (2认同)