怎样判断某个整数是否是2的幂也是程序员面试中经常被问到的问题之一,奇怪的是,这个看似很容易回答的问题,对很多开发人员来说却并不那么简单。很多java开发人员,新手和经验少的人,叫他去写一个方法判断某个整数是否是2的幂,他会感觉很困难。这个可能有很多原因,但是希望至少能给出一般的解决方案。如何用二进制表示正数和负数对于那些很熟悉位移操作的人来说,那是再简单不过了。由于负数是用补码的形式表示,你可以通过它的位组合来判断任何一个数是否是2的幂。记住判断一个整数是否是2的幂和判断这个数是否是偶数或者奇数是不同的,一个数是偶数,但是它不一定是2的幂,比如6是偶数,但是它不是2的幂。
三种方法来判断某个整数是否是2的幂
在这篇文章中我们来看看3个简单的例子用来判断某个整数是否是2的幂。我们有三个方法,分别使用按位操作、一般操作和位移操作来解决这个问题。使用按位操作方法不能检测0是否是2的幂,只能检测大于等于1的整数。下面是3个简单方法用来检测某个整数是否是2的幂的代码:
public class PowerOf2Test {
public static void main(String args[]) {
int[] numbers = {0,1,2,6,8};
for(int num: numbers){
System.out.println("isPowerOfTwo()-- is " + num + " power of two in Java :" + isPowerOfTwo(num));
System.out.println("powerOfTwo()-- is " + num + " power of two in Java :" + powerOfTwo(num));
System.out.println("checkPowerOfTwo()-- is " + num + " power of two in Java :" + checkPowerOfTwo(num));
System.out.println("-----------------------------------------------------------");
}
}
/*
* checking if number is power of 2 using bit shift operator in java
* e.g. 4 in binary format is "0000 0000 0000 0000 0000 0000 0000 0100";
* and -4 is "1111 1111 1111 1111 1111 1111 1111 1100";
* and 4&-4 will be "0000 0000 0000 0000 0000 0000 0000 0100"
*/
private static boolean isPowerOfTwo(int number) {
/*if(number <=0){
throw new IllegalArgumentException("number: " + number);
}*/
if ((number & -number) == number) {
return true;
}
return false;
}
/*
* checking if number is power of 2 using brute force
* starts with 1, multiplying with 2 it will eventually be same as original number
*/
private static boolean powerOfTwo(int number){
int square = 1;
while(number >= square){
if(number == square){
return true;
}
square = square*2;
}
return false;
}
/*
* find if an integer number is power of 2 or not using bit shift operator
*/
private static boolean checkPowerOfTwo(int number){
/*if(number <=0){
throw new IllegalArgumentException("number: " + number);
}*/
return ((number & (number -1)) == 0);
}
}
以上是关于检测某个整数是否是2的幂的全部。如果你有更好的方法,请贴出来参考参考,(*^__^*)