题目
给你一个整数 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)
};