Представление числа в двоичной системе в Python: от основ до продвинутых техник
Представление числа в двоичной системе в Python: основные подходы
Как получить двоичное представление целого числа наиболее эффективно?
Самый прямой способ - использовать встроенную функцию bin(). Она возвращает строку, начинающуюся с префикса 0b, за которым следует двоичное представление числа.
number = 42
binary_str = bin(number)
print(binary_str) # 0b101010Python двоичная запись (двоичное представление чисел в 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)) # 101010Python перевод в десятичную (перевод в десятичную систему 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)) # 101010Python системы счисления (перевод чисел между системами счисления в 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 10010001111010111000011Python число в двоичной системе (представление числа в двоичной системе в 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: от обучающих упражнений до работы с низкоуровневыми протоколами и бинарными данными.