如何判断一个数是否是2的整数次幂

最近在看一些算法,打算写一些博客把这些巧妙的算法记录下来,分享给大家

题目:判断一个正整数是否是2的整数次幂

解法一:设置一个中间变量初始值为1,将输入的正整数不断和初始值比较,如果初始值小于输入的整数,就乘2再比较,直到后面相等返回true或者大于输入的整数返回false。

举个例子:输入13,1*2=2,2*2=4,4*2=8,8*2=16,16>13,所以返回false,该算法的时间复杂度为O(logn)。

public static boolean isPowerOf2(int num)
{
    int temp = 1;
    while(temp<=num)
    {
        if(temp==num)
        {
            return true;
        }
        temp = temp*2;
    }
    return false;
}

 解法2:c语言中向左移位表示乘以2,但比单纯的乘法效率高,改进之后代码如下,但时间复杂度还是O(logn)。

C语言中左移位和右移位

public static boolean isPowerOf2(int num)
{
    int temp = 1;
    while(temp<=num)
    {
        if(temp==num)
        {
            return true;
        }
        temp = temp<<1;
    }
    return false;
}

 解法3:利用二进制数字特点,将整数转为二进制之后与其-1后的二进制按位与运算。

比如8的二进制为1000,-1之后的二进制为111,16的二进制为10000,-1之后为1111,32的二进制为100000,-1之后为11111,可以看到如果一个数为2的整数次幂,将它本身的2进制数和它本身-1之后的二进制数按位与运算的话结果为0,如果不是2的整数次幂的整数,进行上述运算,结果一定不为0。

public static boolean isPowerOf2(int num)
{
    return(num&num-1)==0;
}

这种方法的时间复杂度只有O(1)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hzTom11

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值