Представление числа в двоичной системе в Python: от основ до продвинутых техник

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

Представление числа в двоичной системе в Python: основные подходы

Как получить двоичное представление целого числа наиболее эффективно?

Самый прямой способ - использовать встроенную функцию bin(). Она возвращает строку, начинающуюся с префикса 0b, за которым следует двоичное представление числа.

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

Python двоичная запись (двоичное представление чисел в python)

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

Альтернативные способы, также рекомендуемые по скорости:

  • Форматная строка: f"{number:b}" - без префикса.
  • Функция format(number, 'b') - аналогично.
number = 42
print(f"{number:b}")       # 101010
print(format(number, 'b')) # 101010

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

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

Классический метод «деления на основание» подходит для обучения и случаев, когда нельзя использовать встроенные функции (например, на собеседовании).

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

print(int_to_bin(42))  # 101010

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

Типичная ошибка: забыть обработать ноль, что приводит к пустой строке. Также важно не перепутать порядок битов - нужно переворачивать список.

Этот вариант медленнее встроенных функций, но наглядно иллюстрирует алгоритм.

Как использовать побитовые операции для получения двоичной записи?

Побитовый сдвиг вправо и маска позволяют извлекать биты по одному.

def int_to_bin_bitwise(n):
    if n == 0:
        return "0"
    bits = []
    while n:
        bits.append('1' if n & 1 else '0')
        n >>= 1
    return "".join(reversed(bits))

print(int_to_bin_bitwise(42))  # 101010

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

Проблема: для отрицательных чисел этот метод будет работать неверно, так как в Python сдвиг отрицательных чисел сохраняет знак (арифметический сдвиг). Для отрицательных чисел используется дополнительный код, и проще применить bin(), который уже выводит -0b....

Цель использования - демонстрация работы побитовых операций или задачи, где требуется манипуляция отдельными битами.

Как преобразовать отрицательное целое число?

Функция bin() для отрицательных чисел возвращает строку с минусом перед префиксом, например -0b1010. Чтобы получить представление в дополнительном коде (обычно для фиксированного числа битов), нужно вычислить маску.

negative = -42
bits = 8  # количество бит
mask = (1 << bits) - 1
twos_complement = (negative & mask)
print(f"{twos_complement:0{bits}b}")  # 11010110

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

Ошибка: если не задать маску, результат будет непредсказуемым. Для чисел вне диапазона маски нужно увеличивать количество бит.

Как работать с дробными числами (числа с плавающей точкой)?

Стандартные методы не подходят для float. Нужно преобразовать число в объект Fraction из модуля fractions или использовать модуль struct для доступа к двоичному представлению IEEE 754.

import struct

def float_to_bin(num):
    # упаковка в 4 байта (float) или 8 байт (double)
    packed = struct.pack('!f', num)  # big-endian
    bits = ''.join(f'{byte:08b}' for byte in packed)
    # разбивка на знак, экспоненту, мантиссу
    sign = bits[0]
    exponent = bits[1:9]
    mantissa = bits[9:]
    return f"{sign} {exponent} {mantissa}"

print(float_to_bin(3.14))  # 0 10000000 10010001111010111000011

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

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

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

Встроенные функции по умолчанию не дополняют ведущими нулями. Для дополнения до нужной длины используется метод zfill() или форматирование с указанием ширины.

number = 5
print(bin(number)[2:].zfill(8))  # 00000101
print(f"{number:08b}")          # 00000101

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

Расширенные примеры работы с двоичным представлением в Python

В этом разделе собраны более сложные и неочевидные сценарии использования.

Пример 1. Автоматическое определение размера целого числа в битах

Пример
def bit_length_custom(n):
    if n == 0:
        return 1
    length = 0
    while n:
        length += 1
        n >>= 1
    return length

print(bit_length_custom(1023))  # 10
print(bit_length_custom(1024))  # 11
# Встроенный метод n.bit_length() быстрее, но этот алгоритм нагляден
10
11

Пример 2. Преобразование произвольной последовательности бит (строка) обратно в целое число

Пример
def bin_str_to_int(bits):
    # bits - строка из '0' и '1', без префикса
    return int(bits, 2)

print(bin_str_to_int("101010"))  # 42
# Можно также использовать int("101010", base=2)

# Для строки с префиксом 0b:
print(int("0b110", 0))  # 6
42
6

Пример 3. Инверсия битов (NOT) для фиксированного числа бит

Пример
def bitwise_not(n, bits=8):
    mask = (1 << bits) - 1
    return (~n) & mask

num = 5   # 00000101
result = bitwise_not(num, 8)  # 11111010 -> 250
print(f"{result:08b}")  # 11111010
11111010

Пример 4. Перевод дробного числа в двоичную систему с заданной точностью (алгоритм умножения)

Пример
def fractional_to_bin(fraction, precision=10):
    """Перевод дробной части (0 <= fraction < 1) в двоичную строку."""
    result = []
    for _ in range(precision):
        fraction *= 2
        bit = int(fraction)
        result.append(str(bit))
        fraction -= bit
        if fraction == 0:
            break
    return "0." + "".join(result)

print(fractional_to_bin(0.625))   # 0.101
print(fractional_to_bin(0.1, 8))  # 0.00011001 (неточно, как и в IEEE 754)
0.101
0.00011001

Пример 5. Битовые поля: упаковка нескольких чисел в одно целое

Пример
# Допустим, хотим упаковать 4-битное значение, 5-битное и 7-битное в 16-битное слово
packed = 0
val1 = 12     # 1100 (4 бита)
val2 = 17     # 10001 (5 бит)
val3 = 99     # 1100011 (7 бит)

packed = (val1 << 12) | (val2 << 7) | val3

# Извлечение обратно
mask3 = 0x7F  # 7 бит
mask2 = 0x1F  # 5 бит
mask1 = 0x0F  # 4 бита

extracted3 = packed & mask3
extracted2 = (packed >> 7) & mask2
extracted1 = (packed >> 12) & mask1

print(f"Упаковано: {packed:016b} -> {packed}")
print(f"Извлечено: {extracted1}, {extracted2}, {extracted3}")
Упаковано: 110010001100011 -> 25635
Извлечено: 12, 17, 99

Пример 6. Обработка отрицательных чисел как беззнаковых (использование под капотом)

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

Пример
def to_unsigned(n, bits=32):
    return n & ((1 << bits) - 1)

print(to_unsigned(-1, 8))   # 255 (0b11111111)
print(to_unsigned(-128, 8)) # 128 (0b10000000)
255
128

Пример 7. Вывод таблицы двоичных представлений для диапазона чисел

Пример
def print_binary_table(start, end):
    print(f"{'Decimal':>8} {'Binary':>16}")
    for n in range(start, end + 1):
        print(f"{n:>8} {bin(n):>16}")

print_binary_table(0, 5)
 Decimal          Binary
       0             0b0
       1             0b1
       2            0b10
       3            0b11
       4           0b100
       5           0b101

Пример 8. Использование модуля ctypes для доступа к двоичному представлению чисел с плавающей точкой (IEEE 754)

Пример
import ctypes

def float_bin_ieee754(f):
    # c_float → int (4 байта)
    buf = ctypes.pointer(ctypes.c_float(f))
    as_int = ctypes.cast(buf, ctypes.POINTER(ctypes.c_int32)).contents.value
    return f"{as_int:032b}"

print(float_bin_ieee754(3.14))
# Пример вывода: 01000000010010001111010111000011
01000000010010001111010111000011

Эти примеры покрывают большинство практических задач, связанных с двоичным представлением чисел в Python: от обучающих упражнений до работы с низкоуровневыми протоколами и бинарными данными.

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

En
Python число в двоичной системе (python)