2的幂

2015-07-06  本文已影响0人  讷兔

问题来源:Power of Two

即判断一个整数是否为2的幂,注意这里的整数有可能是负整数,某些针对正整数的算法并不适用。以下是几种通过了测试的代码(C语言)以及在leetcode上测试1108个用例花费的时间。

  1. 除法
    不断对输入的整数做除法,如果最后的商是1,那么这个整数是2的幂;如果商在变为1之前已经是一个奇数(如7/2为3),那么这个整数不是2的幂。代码如下:
    bool isPowerOfTwo(int n) {
    while ((n % 2 == 0) && n > 1)
    n /= 2;
    return (n == 1);
    }
    耗时4ms。
  2. 右移
    这种算法和除法是相等的,除以2实际上相当于右移 1 bit,检查一个二进制数是否为奇数和检查它的最后一位是否为 1 相同。代码如下:
    bool isPowerOfTwo(int n) {
    while (((n & 1) == 0) && n > 1) /* While n is even and > 1 /
    n >>= 1;
    return (n == 1);
    }
    耗时同样为4ms。
    3.数“1”
    这种想法最为自然,因为2的幂表示为二进制都是1后面加上相应数量的0(如32的二进制表示为100000),如果二进制里出现了多于一个的“1”这个整数一定不是2的幂。代码如下:
    bool isPowerOfTwo(int x) {
    unsigned int numberOfOneBits = 0;
    while(x && numberOfOneBits <=1)
    {
    if ((x & 1) == 1) /
    Is the least significant bit a 1? /
    numberOfOneBits++;
    x >>= 1; /
    Shift number one bit to the right /
    }
    return (numberOfOneBits == 1); /
    'True' if only one 1 bit */
    }
    耗时8ms。
    参考资料:Ten Ways to Check if an Integer Is a Power Of Two in C
上一篇 下一篇

猜你喜欢

热点阅读