一、题目内容
给定一个整数,编写一个函数来判断他是否为2的幂次方。
示例1:
输入:1
输出:true
解释:2的0次方为1
示例2:
输入:16
输出:true
解释:2的4次方为16
示例1:
输入:218
输出:false
二、题目分析
这道题是通过位运算来进行求解的非常典型的题目。当然,其他的题解也有很多:比如暴力求解,又或者是不停除以2通过递归的方式求解,等等。但是并不是今天我想说的。
先观察一些是2的幂的二进制数:
可以发现这些数,都是最高位为1,其他位为0。所以我们把问题转化为“判断一个数的二进制,除了最高位为1,是否还有别的1存在”。然后我们再观察下面这样的一组数,对应着上面的数减去1:
我们对两组数求“&”运算:
可以看到,对于N为2的幂的数,都有 N&(N-1)=0 ,所以这就是我们的判断条件。(这个技巧可以记忆下来,在一些别的位运算的题目中也是会用到的)
三、代码实现
func isPowerOfTwo(n int) bool {
return n > 0 && n&(n - 1) == 0
}