标签: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)。
标签:div 技术分享 转换 int span als image code ges
原文地址:http://www.cnblogs.com/xyzyj/p/6290893.html