美文网首页
算法练习3:查看一个数是不是2的整数幂(巧用位运算)

算法练习3:查看一个数是不是2的整数幂(巧用位运算)

作者: miao8862 | 来源:发表于2021-04-05 15:14 被阅读0次

    题目

    给一个正整数,判断这个数是不是2的整数次幂,比如16 = 2^4,返回ture; 15非2的整数次幂,返回false

    暴力枚举法

    设置初始值temp为1,只要temp小于输入的整数num时,就循环让temp乘以2。循环结束后,如果temp等于num,则代表它是2的整数次幂,否则则不是

    • 时间复杂度:O(logn)
    /**
     * @description 判断一个整数是不是2的整数次幂
     * @param num:输入的整数
     * @return res: 结果,返回true或false
     */
    
    function isPowerOf2(num) {
      let temp = 1;
      while(temp < num) {
        temp *= 2
      }
      return temp === num;
    }
    
    console.log(isPowerOf2(16));  // true
    

    高效解法 num & num(n-1) === 0

    我们先看下2的整数次幂的二进制有什么特点:
    2 -------- 10
    4 -------- 100
    8 -------- 1000
    16 -------- 1 0000
    32 -------- 10 0000

    2的整数次幂的二进制除了首位为1,其它位置都为0

    我们再看下2的整数次幂-1的二进制有什么特点:
    1 -------- 01
    3 -------- 011
    7 -------- 0111
    16 -------- 0 1111
    32 -------- 01 1111

    2的整数次幂-1的二进制除了首位为0,其它位置都为1

    两者做与运算,刚刚好可以得到0

    利用以上这个特性,可以解得 O(1)的算法:

    function isPowerOf2(num) {
      return (num & num - 1) === 0;
    }
    
    console.log(isPowerOf2(16));  // true
    

    相关文章

      网友评论

          本文标题:算法练习3:查看一个数是不是2的整数幂(巧用位运算)

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