声明:小白总结,本意是记录自己的思路,不过希望能帮助别人,那就更好啦,若发现问题,欢迎指正,感谢!!
来源:力扣(LeetCode)
链接:2的幂 ---- 4的幂
2的幂
给定一个整数,编写一个函数来判断它是否是 2 的幂次方。
输入: 1
输出: true
解释: 20 = 1
输入: 16
输出: true
解释: 24 = 16
输入: 218
输出: false
从下方的图中发现一些有关2的幂的二进制数的特点:
可以看到,2的幂的二进制数除第一位是1,其余各个位数均为0;并且,2的幂值减一的二进制数每一位数均为1;
然后要谈到符号‘&’,也就是‘and’:
1 & 1 = 1;
1 & 0 = 0;
0 & 1 = 0;
0 & 0 = 0;
再来看一下:
发现2的幂的数有n & (n - 1) == 0;
代码
// java
class Solution {
public boolean isPowerOfTwo(int n) {
int m = n - 1;
return (n > 0) && (n & m) == 0;
}
}
4的幂
给定一个整数 (32 位有符号整数),请编写一个函数来判断它是否是 4 的幂次方。
输入: 16
输出: true输入: 5
输出: false
解决了2的幂问题, 趁热打铁,做一下4的幂
想一下2的幂和4的幂的关系,一个数要想是4的幂,首先要是2的幂,那么要满足 (x > 0) && (n & (n - 1))== 0,怎么将非4的幂排除呢
x = 2^a ,若x为4的幂,那么a要是偶数,即a = 2k
a的取值有两种:a = 2k + 1或a = 2k
代码
// java
class Solution {
public boolean isPowerOfFour(int num) {
return (num > 0) && ((num & (num - 1)) == 0) && (num % 3 == 1);
}
}
感谢各位巨巨们的帮助,希望在记录分析题目的条件下算法能有所提升……