Разбор задачи: Степень двойки

Предложенный нами код решения:

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

Здесь используется битовая операция для проверки, является ли число степенью двойки.

Разбор битовой операции:

  1. Бинарное представление степени двойки:
    • Степени двойки в двоичной системе записи всегда имеют ровно один бит, равный единице, а все остальные биты равны нулю. Например:
      • 2^0 = 10001
      • 2^1 = 20010
      • 2^2 = 40100
      • 2^3 = 81000
      • 2^4 = 1610000
  2. Операция n & (n - 1):
    • Если n является степенью двойки, то в его бинарной записи есть только один бит, равный единице. Если вы вычтете 1 из этого числа, то полученное число будет иметь все биты правее (младшие) инвертированными.
    • Например, если n = 8 (в двоичной записи это 1000):
      • n - 1 = 7 (в двоичной записи это 0111).
    • Когда мы применяем операцию n & (n - 1), результат будет равен 0:
      • 8 & 7 = 1000 & 0111 = 0000, что равно 0.
  3. Проверка равенства с нулем:
    • Если 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 не является степенью двойки.

 


0

Вы должны Войти или Зарегистрироваться чтобы оставлять комментарии