Программа курса:
Разбор задачи: Степень двойки
Предложенный нами код решения:
def is_power_of_two(n):
"""
Проверяет, является ли число n степенью двойки.
:param n: целое число
:return: True, если число является степенью двойки, иначе False
"""
if n <= 0:
return False
# Проверка, что число является степенью двойки
return (n & (n - 1)) == 0
Задача заключается в том, чтобы проверить, является ли заданное целое число n степенью двойки. Степенью двойки является число, которое можно записать как 2^x, где x — целое число.
1. Проверка отрицательных чисел и нуля
if n <= 0:
return False
- Степени двойки всегда положительные числа, начиная с
2^0 = 1,2^1 = 2,2^2 = 4,2^3 = 8и так далее. - Поэтому, если
n <= 0, то число не может быть степенью двойки, и мы сразу возвращаемFalse.
2. Основная логика проверки
return (n & (n - 1)) == 0
Здесь используется битовая операция для проверки, является ли число степенью двойки.
Разбор битовой операции:
- Бинарное представление степени двойки:
- Степени двойки в двоичной системе записи всегда имеют ровно один бит, равный единице, а все остальные биты равны нулю. Например:
2^0 = 1—00012^1 = 2—00102^2 = 4—01002^3 = 8—10002^4 = 16—10000
- Степени двойки в двоичной системе записи всегда имеют ровно один бит, равный единице, а все остальные биты равны нулю. Например:
- Операция
n & (n - 1):- Если
nявляется степенью двойки, то в его бинарной записи есть только один бит, равный единице. Если вы вычтете 1 из этого числа, то полученное число будет иметь все биты правее (младшие) инвертированными. - Например, если
n = 8(в двоичной записи это1000):n - 1 = 7(в двоичной записи это0111).
- Когда мы применяем операцию
n & (n - 1), результат будет равен 0:8 & 7 = 1000 & 0111 = 0000, что равно 0.
- Если
- Проверка равенства с нулем:
- Если
nявляется степенью двойки, то операцияn & (n - 1)даст 0. Это происходит, потому что в числеnтолько один бит равен единице, и вычитание 1 делает все остальные биты равными нулю. - Таким образом, если результат операции
n & (n - 1)равен 0, это означает, чтоnявляется степенью двойки.
- Если
3. Пример работы алгоритма
Пример 1: n = 16
- Бинарное представление 16:
10000 n - 1 = 15, бинарное представление:01111- Операция
n & (n - 1):10000 & 01111 = 00000, результат 0
- Поскольку результат равен 0, число
16является степенью двойки.
Пример 2: n = 18
- Бинарное представление 18:
10010 n - 1 = 17, бинарное представление:10001- Операция
n & (n - 1):10010 & 10001 = 10000, результат не равен 0
- Поскольку результат не равен 0, число
18не является степенью двойки.
Вы должны Войти или Зарегистрироваться чтобы оставлять комментарии