Использование битовых операций для определения степени двойки
На этом этапе мы рассмотрим хитрый способ определить, является ли число степенью двойки с использованием битовых операций на Java. Этот метод часто более эффективен, чем традиционные подходы, основанные на циклах.
Сначала разберемся, что такое степень двойки. Степенью двойки называется любое число, которое может быть представлено в виде 2 в целой степени (например, 2^0 = 1, 2^1 = 2, 2^2 = 4, 2^3 = 8 и так далее). В двоичном представлении степени двойки имеют уникальную закономерность: они представляются в виде 1
, за которым следуют ноль или более 0
(например, 1 - это 1
, 2 - это 10
, 4 - это 100
, 8 - это 1000
).
Теперь рассмотрим двоичное представление степени двойки и числа, предшествующего ей. Например:
- 8 в двоичной системе - это
1000
- 7 в двоичной системе - это
0111
Если выполнить битовую операцию И (&
) между степенью двойки и числом, предшествующим ей, результат всегда будет равен нулю. Это происходит потому, что степень двойки имеет единственный бит 1
, а число перед ней имеет 0
в этой позиции и 1
во всех позициях справа.
Например, 8 (1000
) & 7 (0111
) = 0000
(что равно 0).
Это свойство справедливо для всех положительных степеней двойки. Любое положительное число, которое не является степенью двойки, будет иметь в своем двоичном представлении как минимум два бита 1
. При выполнении битовой операции И с предыдущим числом как минимум один из этих битов 1
совпадет с битом 1
в предыдущем числе, в результате чего получится ненулевое значение.
Таким образом, условие того, что положительное число n
является степенью двойки, можно записать как (n & (n - 1)) == 0
.
Создадим Java-программу для реализации этой проверки.
-
Откройте файл HelloJava.java
в редакторе WebIDE.
-
Замените существующий код следующим:
public class HelloJava {
// Function to check if a number is a power of two using bitwise AND
public static boolean isPowerOfTwo(int n) {
// A number is a power of two if it's positive and (n & (n - 1)) is 0
return (n > 0) && ((n & (n - 1)) == 0);
}
public static void main(String[] args) {
int number1 = 8;
int number2 = 12;
int number3 = 1;
System.out.println(number1 + " is a power of two: " + isPowerOfTwo(number1));
System.out.println(number2 + " is a power of two: " + isPowerOfTwo(number2));
System.out.println(number3 + " is a power of two: " + isPowerOfTwo(number3));
}
}
В этом коде:
- Мы определяем статический метод
isPowerOfTwo
, который принимает целое число n
в качестве входного параметра.
- Внутри метода мы проверяем, что
n
больше 0 и что битовая операция И между n
и n - 1
равна 0.
- Метод
main
демонстрирует, как использовать метод isPowerOfTwo
с несколькими примерами чисел.
-
Сохраните файл (Ctrl+S или Cmd+S).
-
Скомпилируйте Java-программу в терминале:
javac HelloJava.java
Если нет ошибок, компиляция прошла успешно.
-
Запустите скомпилированную программу:
java HelloJava
Вы должны увидеть вывод, похожий на следующий:
8 is a power of two: true
12 is a power of two: false
1 is a power of two: true
Этот вывод подтверждает, что наша битовая проверка правильно определяет степени двойки.