题目
给你一个整数 n,请你判断该整数是否是 2 的幂次方。如果是,返回 true ;否则,返回 false 。
如果存在一个整数 x 使得 n == 2x ,则认为 n 是 2 的幂次方。
示例
示例 1:
输入: n = 1
输出: true
解释: 20 = 1
示例 2:
输入: n = 16
输出: true
解释: 24 = 16
示例 3:
输入: n = 3
输出: false
示例 4:
输入: n = 4
输出: true
示例 5:
输入: n = 5
输出: false
提示
-2^31 <= n <= 2^31 - 1
进阶
你能够不使用循环/递归解决此问题吗?
解决思路
顺着题意书写(暴力)
- 特殊判断
n = 1 为 2^0;n = 0则不是2的幂次方 - 除此之外,都需要将
n一直%2,如果出现余数不为0,则表示不是2的幂次方,只是能整除2或者不能整除2
代码展示
/**
* @param {number} n
* @return {boolean} */
var isPowerOfTwo = function(n) {
while(true) {
if(n == 1) return true
if(n == 0) return false
if(n % 2 === 0) {
n = n / 2
}else {
return false
}
}
};
位运算
- 判断
n是不是2的幂次方,那么n一定大于0的 =>n > 0 - 举例:因为
n是2的幂次方- 有
2 ^ x最高位为1,其余位全部为0 - 有
2 ^ x - 1最高位为0,其余位全部为1 - 因此
2 ^ x与2 ^ x - 1按位&,常等于=0
- 有
代码展示
/**
* @param {number} n
* @return {boolean}
*/
var isPowerOfTwo = function(n) {
return n > 0 && ((n & (n - 1)) == 0)
};