原题
给定一个整数,编写一个函数来判断它是否是 2 的幂次方。
示例 1:
输入: 1
输出: true
解释: 20 = 1
示例 2:
输入: 16
输出: true
解释: 24 = 16
示例 3:
输入: 218
输出: false
思路
我们首先看一组数字的二进制, 2^n
的二进制只有一位是 1 其余全是 0,2^n - 1
的二进制全是 1 。按位与的取值规则如下,1 & 1 等于 1;1 & 0 等于 0;0 & 1 等于 0;0 & 0 等于 0。所以 2^n & 2^n-1 等于 0。我们可以利用这个特性,判断数字是否为 2 的次幂。
// 2
0b10
// 1
0b01
// 0
0b10 & 0b01 === 0
// 4
0b100
// 3
0b011
// 0
0b100 & 0b011 === 0
// 256
0b100000000
// 255
0b011111111
// 0
0b100000000 & 0b011111111 === 0
// 128
0b10000000
// 127
0b01111111
// 0
0b10000000 && 0b01111111 === 0
代码
解法 1
/**
* @param {number} n
* @return {boolean}
*/
var isPowerOfTwo = function(n) {if (n <= 0) {return false}
if ((n & n - 1) === 0) {return true}
return false
};
解法 2
2^n
必然会被1 << 31
整除, 也可以利用这一点解答
/**
* @param {number} n
* @return {boolean}
*/
var isPowerOfTwo = function(n) {if (n <= 0) {return false}
if ((1 << 31) % n === 0) {return true}
return false
};