2的幂

作者: 讷兔 | 来源:发表于2015-07-06 16:49 被阅读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

    相关文章

      网友评论

          本文标题:2的幂

          本文链接:https://www.haomeiwen.com/subject/nmmyqttx.html