Разбор задачи: Дополнение чисел

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

def find_complement(num):
    """
    :param num: целое число, для которого нужно найти дополнение
    :return: дополнение числа в виде целого числа
    """
    if num == 0:
        return 1  # Дополнение числа 0 всегда будет 1
    
    # Находим маску (число, которое полностью состоит из единиц длиной как двоичное представление num)
    mask = (1 << num.bit_length()) - 1
    # Применяем XOR с маской, чтобы получить дополнение
    complement = num ^ mask
    return complement

  1. Проверка на 0:

    if num == 0:
        return 1
    

    Здесь предусмотрен случай, когда входное число num равно 0. В этом случае дополнение числа 0 всегда будет равно 1, так как двоичное представление числа 0 — это просто 0, и его дополнение будет равно 1.

  2. Вычисление маски:

    mask = (1 << num.bit_length()) - 1
    

    Здесь используется побитовый сдвиг, чтобы создать маску, которая состоит из единичных битов той же длины, что и двоичное представление числа num.

    • Функция num.bit_length() возвращает количество бит, необходимых для представления числа в двоичной системе (например, для числа 5 (двоично 101) bit_length вернет 3).
    • Операция сдвига на 1 << num.bit_length() создаст число, которое в двоичной системе будет содержать 1 в старшем бите, а все остальные биты будут нулями. Например, для числа 5 с bit_length 3, это будет 8 (в двоичной системе 1000).
    • Затем, вычитаем 1, чтобы получить маску, в которой все биты установлены в 1, кроме ведущего бита. Например, для числа 5 результат будет 7 (в двоичной системе 111).
  3. Применение операции XOR:

    complement = num ^ mask
    

    Операция XOR (^) с маской меняет все биты числа num на противоположные. То есть, где в маске стоит 1, в числе num биты будут инвертированы. Это и есть процесс нахождения дополнения числа.

  4. Возвращение результата:

    return complement
    

    Возвращается результат инвертирования битов числа.

Пример работы функции:

  • Для числа 5:
    • Двоичное представление 5: 101
    • Маска: (1 << 3) - 1 = 7, двоичное представление: 111
    • XOR: 101 ^ 111 = 010
    • Результат: 2
  • Для числа 0:
    • Дополнение числа 0 всегда будет равно 1.

 



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