找出小于等于一个给定数N的最大的2的幂
做法:将数N表示成二进制,并设法(下面会实现)使most significant bit(就是最高位是1的位)以后的所有位设置为1,如: N = (101011), 即十进制的43,经过上述方法变成 (111111),即十进制的63,并对该结果加一得到(1000000),再除以2得到(100000)即十进制的32就是我们要找的小于等于N的最大的2的幂。
具体实现如下:
#include <iostream>
using namespace std;
int largest_power(unsigned int N)
{
// assume int is 32bit
N = N | (N>>1);
N = N | (N>>2);
N = N | (N>>4);
N = N | (N>>8);
N = N | (N>>16);
return (N + 1) >> 1;
}
int main(int argc, char **argv)
{
const int kRange = 20;
for (int i = 0; i < kRange; ++i)
cout << "largest power of two (<= " << i << ") is: " << largest_power(i) << endl;
return 0;
}
运行结果如下: