美文网首页
算法练习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