求解power of tow问题(判断一个数是否为2的幂次方数)

本文介绍三种方法判断一个整数是否为2的幂次方数。方法一使用位运算,通过计数1的个数来判断;方法二是方法一的递归版本;方法三利用2的幂次方数减1后的特性进行判断。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

public class PowerOfTow {

    public static void main(String[] args) {
        System.out.println(isPowerOfTow(4));
        System.out.println(isPowerOfTow1(4, 0));
        System.out.println(isPowerOfTow2(3));
    }

    /**
     * 解法一:
     * 2的幂次方数都有一个特点,就是只有高位为1,其它位都是0,所以值需要统计位当中出现了几个1即可
     * 那这个怎么实现呢?那就是让这个数n不断的左移,然后与1相与,如果是2的幂次方,
     * 那么除了最高位移到了最右与1相与能得到1,其它的情况下都得到的是0,
     * 所以将这些相与的结果(把01)相加如果等于1那就说明是2的幂次方数
     * @param n
     * @return
     */
    private static  boolean isPowerOfTow(int n) {
        int curr = 0;
        while (n > 0) {
            curr += n & 1;
            n = n >> 1;
        }
        return  curr == 1;
    }

    /**
     * 这中解法就是解法一的思路,只不过是用递归代替了循环
     * @param n
     * @param curr
     * @return
     */
    private static boolean isPowerOfTow1(int n, int curr) {
        if (n <= 0)
            return curr == 1;
        return  isPowerOfTow1(n >> 1, curr += n & 1);
    }

    /**
     * 解法二:
     * 这中解法也是根据2的幂次方数的二进制数特点来实现的,
     * 只要是2的幂次方数都是最高位是1,其它位是0
     * 那么只要将一个最高为是0其它位是1的数和这个数相与就能得到0,这个数就是当前2的幂次方数减一即可
     *
     * @param n
     * @return
     */
    private static boolean isPowerOfTow2(int n) {
        return ((n & (n - 1)) == 0);
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值