给定一个整数,编写一个函数来判断它是否是 2 的幂次方。
示例 1:
输入: 1
输出: true
解释: 20 = 1
示例 2:
输入: 16
输出: true
解释: 24 = 16
示例 3:
输入: 218
输出: false
思路
1.将数字循环除以2,到最后判断是余1还是0,余1则不是2的幂次方。
public boolean isPowerOfTwo(int n) {
if (n == 0) return false;
while (n % 2 == 0) {
n /= 2;
}
return n == 1;
}
2.使用位运算,如果n为2的幂次方,那么二进制位上只有一位是1,然后n-1变为原先为1的位变成0,右边的所有位变为1,所以相&后结果为0,则为2的幂次方。
public boolean isPowerOfTwo(int n) {
if (n <= 0) {
return false;
}
return (n & (n - 1)) == 0;
}
3.承接思路2,如果n为2的幂次方,那么二进制位上只有一位是1,所以用Integer.bitCount(n)统计二进制中1的个数为1。
public boolean isPowerOfTwo(int n) {
if (n <= 0) {
return false;
}
return Integer.bitCount(n) == 1;
}
扩展
给定一个正整数 num,编写一个函数,如果 num 是一个完全平方数,则返回 True,否则返回 False。
1.使用二分法找到是否存在一个数乘以自己等于num。
public static boolean isPerfectSquare(int num) {
if (num<2){
return true;
}
//使用int时mid*mid>Integer.MAX_VALUE
long l=2;
long h=num/2;
long mid;
while (l<=h){
mid=(l+h)/2;
if (mid*mid==num){
return true;
}else if (mid*mid<num){
l=mid+1;
}else {
h=mid-1;
}
}
return false;
}