乐趣区

leetcode2312的幂

原题

给定一个整数,编写一个函数来判断它是否是 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
};
退出移动版