342.4的幂
解题思路:利用位运算以及规律:判断2的幂:x>0&&(x&(x-1))==0,x & (x - 1)其实就是把数字最后一位1变为0,也就是检查数字x是否只有一个1
package leadcode;
/**
* @author : icehill
* @description : 4的幂
* 给定一个整数,写一个函数来判断它是否是 4 的幂次方。如果是,返回 true ;否则,返回 false 。
* 整数 n 是 4 的幂次方需满足:存在整数 x 使得 n == 4x
* 示例 1:
* 输入:n = 16
* 输出:true
* 示例 2:
* 输入:n = 5
* 输出:false
* 示例 3:
* 输入:n = 1
* 输出:true
* 提示:
* -231 <= n <= 231 - 1
* 进阶:
* 你能不使用循环或者递归来完成本题吗?
* 来源:力扣(LeetCode)
* 链接:https://leetcode-cn.com/problems/power-of-four
* 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
* 解题思路:
* 暴力做法循环取余4这种我们就不考虑了,这题就是为了考位运算,我们使用位运算来处理
* 判断一个数是不是2的幂:x>0& (x&(x-1)==0)
* 把问题转换成,求2的偶数幂(4的幂),解法有以下两种
* 时间复杂度:O(1) 空间复杂度:O(1)
* @date : 2021-05-23
*/
public class Solution342 {
public static void main(String[] args) {
Solution342 solution342 = new Solution342();
System.out.println(solution342.isPowerOfFour(1));
System.out.println(solution342.isPowerOfFour(2));
System.out.println(solution342.isPowerOfFour(4));
System.out.println(solution342.isPowerOfFour(8));
System.out.println(solution342.isPowerOfFour(9));
System.out.println(solution342.isPowerOfFour(16));
}
/**
* 判断是否是2的幂且幂的个数是偶数
*
* @param n
* @return
*/
public boolean isPowerOfFour(int n) {
if (n <= 0 || (n & (n - 1)) != 0) {
return false;
}
int count = 0;
while (n != 0) {
if ((n & 1) == 1) {
break;
}
n >>= 1;
count++;
}
return (count % 2) == 0;
}
/**
* 判断是否是2的幂,且跟0xaaaaaaaa(1431655765)做与运算是否为0
* 首先我们考虑一个数字是不是 2 的(整数)次方:如果一个数字 n 是 2 的整数次方,那么它
* 的二进制一定是 0...010...0 这样的形式;考虑到 n − 1 的二进制是 0...001...1,这两个数求按位与
* 的结果一定是 0。因此如果 n & (n - 1) 为 0,那么这个数是 2 的次方。
* 如果这个数也是 4 的次方,那二进制表示中 1 的位置必须为奇数位。我们可以把 n 和二进制
* 的 10101...1010(即十进制下的 1431655765)做按位与,如果结果为 0,那么说明这个数是 4 的次方。
* (就是与2的奇数幂做与运算,如果错开(结果为0)则说明是偶数幂,否则结果不为0)
*
* @param n
* @return
*/
public boolean isPowerOfFourTwo(int n) {
return n > 0 && (n & (n - 1)) == 0 && (n & 0xaaaaaaaa) == 0;
}
}