[Leetcode学习] Power of Two(判断2的指数)

问题:

难度:easy

网址链接:https://leetcode.com/problems/power-of-two/

说明:

水题,输入一个N正整数,求是否是2^N的数。

输入案例:

Example 1:

Input: 1
Output: true 
Explanation: 20 = 1
Example 2:

Input: 16
Output: true
Explanation: 24 = 16
Example 3:

Input: 218
Output: false

我的代码:

正常思路是输入一个N,然后和2的N次方比较,发现最后2的N次方超过了它就不是,否则发现相等就是。

不过可以更简单,就是利用位运算,2的指数在 32位带符号位 INT 里面都是只有一个位是1的数,运算量32次以内就可以了。

class Solution {
    public boolean isPowerOfTwo(int n) {
        // 排除0
        if(n <= 0) return false;
        
        // 使用 位元 作为 蒙版,找出第一个 1
        int a = 1;
        for(int i = 0;i < 32;i ++) {
            // 找到了之后,马上跳出
            if((n & a) != 0) break;
            // 没找到就继续移位
            a <<= 1;
        }

        // -1 ^ a 将蒙版反转,然后和n进行 &,如果仅有一个 1,那么true,不然false
        return ((-1 ^ a) & n) == 0;
    }
}

其它代码:

如果只有一个1,n - 1的话得出得数和 n 进行 &,都为0。

class Solution {
    public boolean isPowerOfTwo(int n) {
        // 末尾有1,或者不只有一个1的数,& 都不会为0
        return (n > 0) && (n & (n - 1)) == 0;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值