找出小于等于一个给定数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;
}

运行结果如下:

posted @ 2020-07-29 14:41  jackie_astro  阅读(831)  评论(0编辑  收藏  举报