判断一个数是否为2的n的次方数,这是一个很简单的问题。但这里不是着重解决此问题,而是以不同方式来实现,重点在于不同方式的实现思路
方法一(*****推荐)
实现思路:将要判断的数与它的前一个数进行按位运算,判断结果是否为0
这种方式实现简洁且效率高,推荐使用。
public static boolean isPowerOfTwo(int num){
if((num & (num-1)) == 0)
return true;
else
return false;
}
方法二
实现思路:将要判断的数转换成二进制数,再来判断二进制数中是否只有一个1
public static boolean isPowerOfTwo(int num){
if(Integer.toBinaryString(num).indexOf('1') == Integer.toBinaryString(num).lastIndexOf('1')){
return true;
}else{
return false;
}
}
方法三
实现思路:将要判断的数转换成二进制数,并将其中的0全部舍去,最后判断最后的长度是否为1
public static boolean isPowerOfTwo(int num){
return Integer.toBinaryString(num).replaceAll("0", "").length() == 1;
}
方法四
实现思路:将要判断的数转化成字节数组,判断其中的ASCII码,0的ASCII码为48
public static boolean isPowerOfTwo(int num) {
if (num == 0) {
return false;
}
boolean flag = true;
String str = Integer.toBinaryString(num);
byte[] bytes = str.getBytes();
for (int i = 1; i < bytes.length; i++) {
// 判断除第一位数,其它数是否全是0
if (bytes[i] != 48) {
flag = false;
break;
}
}
return flag;
}
方法五
实现思路:先%2,在除2,判断结果是否为1
public static boolean isPowerOfTwo(int num){
int temp = num;
while (temp % 2 == 0) {
temp /= 2;
}
if (temp == 1) {
return true;
} else {
return false;
}
}
方法六
实现思路:设定一个基数为2,将要判断的数与基数比较,若基数小于判断的数,将基数乘2,直至最后大于或等于要判断的数
public static boolean isPowerOfTwo(int num) {
boolean flag = false;
int baseNum = 2;
while (true) {
if (num == 1 || baseNum == num) {
flag = true;
break;
} else if (baseNum < num) {
baseNum = 2 * baseNum;
} else {
flag = false;
break;
}
}
return flag;
}
总结
上述使用6种方式来解决一个数是否为2的n次方问题,但总体来说,基本思路只有两种
- 将数转化为二进制,判断1的个数
- 将数进行% 、/ 运算判断