342.4的幂

97 篇文章 0 订阅
70 篇文章 0 订阅

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;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值