码迷,mamicode.com
首页 > 其他好文 > 详细

判2的乘方

时间:2017-01-16 20:59:36      阅读:192      评论:0      收藏:0      [点我收藏+]

标签:div   技术分享   转换   int   span   als   image   code   ges   

题目:实现一个方法,判断一正整数是否是2的乘方(比如16是2的4次方,返回true;18不是2的乘方,返回false)要求性能尽可能高。

解法一:创建一个中间变量Temp,初始值是1,然后进入一个循环,循环中每次让Temp和目标整数比较,如果相等,则说明目标整数是2的乘方,如果不相等,则让Temp增加一                倍,继续循环比较。让Temp大于目标整数时,说明目标整数不是2的乘方。

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

 解法二:把解法一的乘以2操作改成向左移位,移位的性能比乘法高的多,代码如下:

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

前两种算法的时间复杂度是O(logN).

解法三

1) 把前两种解法的2的乘方的结果转换成2进制数,十进制的2转化成二进制是10B,4转换成二进制是100B,8转换成二进制是1000B...如下图

技术分享

2)即只要是2的乘方的数转换成二进制结果中只有一个1,再把这些2的乘方都减去1,转换成二进制数为:

技术分享

 3)用2的乘方的本身和它减去1的结果进行按位与运算,也就是N&N-1,结果如下:

技术分享

即只有是2的乘方,按以上步骤结果都为0,代码如下

public static boolean ispowerOf2(Integer number){
    return (number & number - 1) == 0;
}

该算法的时间复杂度为O(1)。

 

判2的乘方

标签:div   技术分享   转换   int   span   als   image   code   ges   

原文地址:http://www.cnblogs.com/xyzyj/p/6290893.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!