题目描述
给定一个整数,编写一个函数来判断它是否是 2 的幂次方。
示例 1:
输入: 1
输出: true
解释: = 1
示例 2:
输入: 16
输出: true
解释: = 16
示例 3:
输入: 218
输出: false
思路分析
- 首先想得到的就是使用数学中的对数,如果 结果为整数,则说明n是2的幂次方
- 然后看了评论之后,发现还有一种使用位运算(&)的解法。基于“如果是2的幂次方,那么这个数的二进制表示,只有一位是1,其他都是0”。
- 那么就可以通过计算n、n-1与运算的结果判断。如n=8(00001000)、n-1 = 7 (00000111). 8 & 7 = 0(00000000)
AC代码
// 取对数。
// Java中Math只有以e或10为底的对数方法,可以通过换底公式log(x)(y) =log(e)(x) / log(e)(y)曲线救国
func isPowerOfTwo(n int) bool {
if n <= 0 {
return false
}
x := math.Log2(float64(n))
return x == float64(int64(x))
}
// 与运算
func isPowerOfTwo(n int) bool {
if n <= 0 {
return false
}
return n&(n-1) == 0
}
总结
- 解题时要多尝试不同方法,注意题目的考察点。比如这题用位运算更合适。