高效判断一个数是否是2的幂次方

一个数是否是2的幂次方,比较常用的是递归和移位运算进行判断。递归算法的思想很简单,就是不断的模上2去判断。

如果一个数是2的幂,那么它的二进制表示中就只有一位1,例如:10000,1000,100等等。所以如果对数字1进行移位操作,总会在移到某个位的时候和这个数相等。这就是移位判断的思想。

下面给出实现的代码,在实现中,还采用了第三种方式,因为二进制表示的2的幂次方数中只有一个1,后面跟的是n个0; 因此问题可以转化为判断1后面是否跟了n个0。如果将这个数减去1后会发现,仅有的那个1会变为0,而原来的那n个0会变为1;因此将原来的数与上(&)减去1后的数字,结果为零。
      (num & num - 1) == 0
public class TwoPower {

    /**
     * 递归算法实现
     *
     * @param num
     * @return
     */
    static int is2Power(int num){
        if(num < 2)
            return -1;

        if(num == 2){
            return 1;
        }else if(num % 2 == 0){
            return is2Power(num / 2);
        }else
            return -1;
    }
    
    /**
     * 位与判断,最快
     *
     * @param num
     * @return
     */
    static int anotherIs2Power(int num) {
        if(num < 2)
            return -1;
        
        if((num & num - 1) == 0 )
            return 1;
        else
            return -1;
    }
    
    /**
     * 移位判断
     *
     * @param num
     * @return
     */
    static int binaryIs2Power(int num) {
        if(num < 2)
            return -1;
        
        int temp = 1;
        while (num > temp) {  
            temp <<= 1;  
        }  
    
        return temp == num ? 1 : -1;
    }
    
    public static void main(String[] args) {
        long start = System.currentTimeMillis();
        for(int i = 0;i< 2000000 ; i = i + 2){
            if(is2Power(i) == 1){
                System.out.print(i + "  ");
            }
        }

        long end = System.currentTimeMillis();
        System.out.println("consume -> " + (end - start));
        
    }
}
分别运行上面的三种算法,在我的双核2.8GHz,2G内存的老机器上,
递归查找2000000以内2的幂次方的数字,实际执行100w次循环,时间是47ms;
移位运算查找2000000以内,实际执行100w次循环,时间是31ms;
而第三种位与运算查找2000000以内的方法,执行100w次循环,需要的时间仅仅是15ms。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值