Проблема
Как проверить, является ли целое число степенью двойки?
Решение
3 простых примера, чтобы проверить, является ли какое-либо целое число степенью двойки или нет.
У нас есть три метода, в которых для решения этой проблемы используются побитовый оператор, метод грубой силы и операторы битового сдвига.
Метод, использующий побитовые операторы, не может проверить, является ли ноль степенью 2 или нет,
и работает только для целого числа, которое больше или равно 1.
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);
}
}
Output:
isPowerOfTwo()-- is 0 power of two in Java :true
powerOfTwo()-- is 0 power of two in Java :false
checkPowerOfTwo()-- is 0 power of two in Java :true
-----------------------------------------------------------
isPowerOfTwo()-- is 1 power of two in Java :true
powerOfTwo()-- is 1 power of two in Java :true
checkPowerOfTwo()-- is 1 power of two in Java :true
-----------------------------------------------------------
isPowerOfTwo()-- is 2 power of two in Java :true
powerOfTwo()-- is 2 power of two in Java :true
checkPowerOfTwo()-- is 2 power of two in Java :true
-----------------------------------------------------------
isPowerOfTwo()-- is 6 power of two in Java :false
powerOfTwo()-- is 6 power of two in Java :false
checkPowerOfTwo()-- is 6 power of two in Java :false
-----------------------------------------------------------
isPowerOfTwo()-- is 8 power of two in Java :true
powerOfTwo()-- is 8 power of two in Java :true
checkPowerOfTwo()-- is 8 power of two in Java :true
-----------------------------------------------------------