Конвертация десятичного числа в двоичное представление на языке Питон

Раздел: Числа -> Преобразование систем счисления

Преобразование десятичного числа в двоичную систему счисления – одна из базовых операций при работе с компьютерными системами. В Python существует несколько способов выполнить такую конвертацию, от встроенных функций до самостоятельной реализации алгоритма. Каждый вариант имеет свои особенности и области применения.

Основные способы преобразования числа в двоичную запись

Наиболее эффективное решение: функция bin()

Встроенная функция bin(x) принимает целое число и возвращает строку с его двоичным представлением, начиная с префикса 0b. Это самый простой и быстрый способ.

number = 42
binary_str = bin(number)
print(binary_str)  # 0b101010

Python перевести число в двоичное (перевод числа в двоичную систему в python)

Если нужно получить строку без префикса, достаточно срезать первые два символа: binary_str[2:].

print(bin(255)[2:])  # 11111111

системы счисления чисел в python (системы счисления в python)

Типичные проблемы и их решения:

  • Отрицательные числа: bin(-5) вернёт -0b101. Если требуется дополнительное представление, необходимо вручную выполнить преобразование (примеры в расширенных вариантах).
  • Префикс 0b может мешать при дальнейшей обработке – удалите его срезом.

Как получить двоичную строку без префикса 0b с помощью форматирования?

Методы format() и f-строки позволяют сразу получить чистую бинарную запись без префикса.

number = 42
# С помощью format()
res1 = format(number, 'b')
print(res1)  # 101010

# С помощью f-строки
res2 = f"{number:b}"
print(res2)  # 101010

Цель использования:

Применяется, когда нужно экономить на дополнительном срезе или требуется фиксированная ширина (например, format(number, '08b') для восьми бит).

Возможные сложности:

  • Если число отрицательное, результат будет начинаться с минуса, например format(-5, 'b') даст -101. Для дополнительного кода нужно реализовать отдельно.
  • При указании ширины, как в format(5, '08b'), для отрицательных чисел возникнет ValueError: не удаётся дополнить отрицательное число нулями. Следует сначала получить дополнительный код или использовать абсолютное значение.

Как вручную перевести число в двоичную систему с помощью цикла?

Алгоритм основан на последовательном делении числа на 2. Остатки от деления (0 или 1) собираются в обратном порядке.

def to_binary(n):
    if n == 0:
        return "0"
    binary_digits = []
    while n > 0:
        binary_digits.append(str(n % 2))
        n //= 2
    return ''.join(reversed(binary_digits))

print(to_binary(42))   # 101010
print(to_binary(0))    # 0
print(to_binary(255))  # 11111111

Цель использования:

Образовательная – лучше понять принцип работы двоичной системы. Метод подходит, если по какой-то причине недоступны встроенные функции (редко).

Типичные ошибки:

  • Забыть обработать ноль – приведёт к пустой строке.
  • Не переворачивать список остатков – порядок битов будет неверным.
  • Деление на 2 должно быть целочисленным (//), иначе бесконечный цикл.

Как реализовать рекурсивный алгоритм перевода?

Рекурсия – естественная запись алгоритма деления: функция вызывает себя для частного и добавляет остаток.

def recursive_binary(n):
    if n == 0:
        return "0"
    if n == 1:
        return "1"
    return recursive_binary(n // 2) + str(n % 2)

print(recursive_binary(42))  # 101010
print(recursive_binary(0))   # 0

Цель использования:

Демонстрация концепции рекурсии. Подходит для небольших чисел, так как глубина стека ограничена.

Проблемы:

  • Для нуля нужно отдельное условие, иначе рекурсия зациклится или вернёт пустую строку.
  • Для больших чисел может возникнуть RecursionError из-за превышения глубины рекурсии (Python по умолчанию ограничивает 1000 вызовов).

Как перевести число, используя битовые маски и сдвиги?

Операции сдвига вправо (>>) и побитового И (&) позволяют извлекать каждый бит.

def bitwise_binary(n):
    if n == 0:
        return "0"
    bits = []
    while n:
        bits.append(str(n & 1))  # младший бит
        n >>= 1                  # сдвиг вправо
    return ''.join(reversed(bits))

print(bitwise_binary(42))  # 101010

Цель использования:

Даёт полный контроль над процессом, полезно при работе с битовыми масками, флагами, встраиваемых системах.

Ошибки и нюансы:

  • Для отрицательных чисел сдвиг арифметический (знаковый бит копируется), поэтому цикл может стать бесконечным. Рекомендуется предварительно взять абсолютное значение и отдельно обработать знак.
  • Порядок битов – от младшего к старшему, требуется разворот.

Расширенные примеры и нестандартные ситуации

1. Перевод отрицательных чисел с фиксированной разрядностью (дополнительный код). Для представления отрицательного числа в дополнительном коде (например, 8 бит) можно использовать следующий приём:

Пример
def to_twos_complement(n, bits=8):
    if n >= 0:
        return f"{n:0{bits}b}"
    # для отрицательных: 2^bits + n
    return f"{(1 << bits) + n:0{bits}b}"

print(to_twos_complement(-5, 8))   # 11111011
print(to_twos_complement(42, 8))   # 00101010
print(to_twos_complement(-128, 8)) # 10000000
11111011
00101010
10000000

2. Преобразование обратно из двоичной строки. Функция int() с указанием основания 2:

Пример
binary_string = "101010"
number = int(binary_string, 2)
print(number)  # 42

# с префиксом 0b:
number2 = int("0b101010", 2)
print(number2)  # 42
42
42

3. Генерация всех подмножеств с помощью битовых масок. Двоичное представление удобно для перебора комбинаций:

Пример
items = ['a', 'b', 'c']
n = len(items)
for mask in range(1 << n):
    subset = [items[i] for i in range(n) if (mask >> i) & 1]
    print(f"{mask:0{n}b} -> {subset}")
000 -> []
001 -> ['a']
010 -> ['b']
011 -> ['a', 'b']
100 -> ['c']
101 -> ['a', 'c']
110 -> ['b', 'c']
111 -> ['a', 'b', 'c']

4. Форматирование с разделением битов по группам. Для удобства чтения длинных двоичных чисел:

Пример
def binary_grouped(n, group=4):
    b = bin(n)[2:]
    # добавляем ведущие нули, чтобы длина была кратна group
    remainder = len(b) % group
    if remainder:
        b = '0' * (group - remainder) + b
    return ' '.join(b[i:i+group] for i in range(0, len(b), group))

print(binary_grouped(255))      # 1111 1111
print(binary_grouped(1024))     # 0100 0000 0000
print(binary_grouped(123456))   # 0001 1110 0010 0100 0000
1111 1111
0100 0000 0000
0001 1110 0010 0100 0000

5. Работа с большими числами. Python автоматически поддерживает длинную арифметику, поэтому bin() корректно работает с числами произвольного размера:

Пример
big_num = 2**100
print(bin(big_num)[2:])  # выведет 1 и 100 нулей
print(len(bin(big_num)[2:]))  # 101
10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
101

6. Проверка, установлен ли конкретный бит. Используется при работе с флагами:

Пример
flags = 0b1101  # биты: 3-й (0b1000), 2-й (0b0100), 0-й (0b0001)
bit_position = 2   # нумерация с младшего (0)
is_set = (flags >> bit_position) & 1
print(f"Бит {bit_position} установлен: {bool(is_set)}")
Бит 2 установлен: True

Перевод числа в двоичную систему в Python - comments

En
Python перевести число в двоичное (python)