判断一个数是否为2的整数次幂
一、从1开始进行循环,每次 *2,时间复杂度为O(logn)
public static boolean isPowerof2V1(int num) {
int i = 1;
boolean flag = false;
while (i <= num) {
if (i == num) {
flag = true;
break;
}
i *= 2;
}
return flag;
}
二、将 *2运算改成位运算,效率稍微提升,时间复杂度为O(logn)
public static boolean isPowerof2V2(int num) {
int i = 1;
boolean flag = false;
while (i <= num) {
if (i == num) {
flag = true;
break;
}
i = i << 2;
}
return flag;
}
三、时间复杂度为O(1)(效率最高)
/**
* 十进制 二进制 二进制-1
* 2 10 1
* 4 100 11
* 8 1000 111
* 16 10000 1111
* 32 100000 11111
* 64 1000000 111111
* 100 1100100 1100011
* 2的整数次幂二进制只有最高位为0,-1则所有的为上都为1
* 所以只要是整数次幂,n和n-1相与,则结果为0
* @param num
* @return
*/
public static boolean isPowerof2V3(int num) {
return (num & (num - 1)) == 0;
}