1、题目
231. 2 的幂https://leetcode.cn/problems/power-of-two/
给你一个整数 n,请你判断该整数是否是 2 的幂次方。如果是,返回 true ;否则,返回 false 。
如果存在一个整数 x 使得 n == ,则认为 n 是 2 的幂次方。
示例 1:
输入:n = 1
输出:true
解释: = 1
示例 2:
输入:n = 16
输出:true
解释: = 16
示例 3:
输入:n = 3
输出:false
提示:
<= n <=
进阶:你能够不使用循环/递归解决此问题吗?
2、题解
题解1:使用循环
2的幂次方,肯定是大于等于1的,因为 = 1,所以当n<1的时候,就可以直接返回false了。
对n循环除以2,看最后的余数是否是1,如果不是1,那肯定不是2的幂次方。
class Solution {public boolean isPowerOfTwo(int n) {if (n < 1) {return false;}while (n % 2 == 0) {n /= 2;}return n == 1;}
}
题解2:使用位运算(进阶版)
2的幂次方,肯定是大于等于1的,因为 = 1,所以n>0 必须成立。
由于2的幂次方的二进制,除了第一个数位是1,其余都是0,而2的幂次方-1的二进制,所有数位都是1,例如
= 2 -> 10 , = 1 -> 1
= 4 -> 100 , = 3 -> 11
= 8 -> 1000 , = 7 -> 111
......
所以 与 的二进制相与之后,是0,例如:
& () =100 & 11 =0
因此,如果n是2的幂次方,那 n & (n-1) == 0 也必须成立。
class Solution {public boolean isPowerOfTwo(int n) {return n > 0 && (n & (n - 1)) == 0;}
}