Перевод систем счисления в Python: встроенные функции и собственные алгоритмы
Основные подходы к переводу систем счисления в Python
В Python существуют как встроенные средства, так и возможности для создания собственных алгоритмов. Ниже рассмотрены наиболее эффективный способ и альтернативные реализации.
Встроенные функции: быстро и надежно
Для перевода строки, представляющей число в системе с основанием от 2 до 36, в целое число используется функция int() с указанием основания.
number = int("1010", 2) # 10
hex_val = int("FF", 16) # 255алгоритм перевода систем счисления python (алгоритм перевода систем счисления на python)
Обратное преобразование (из числа в строку) для популярных систем выполняется функциями bin(), oct(), hex(). Для произвольного основания можно воспользоваться format() или f-строками, но только для оснований 2, 8, 16.
print(bin(10)) # 0b1010
print(oct(10)) # 0o12
print(hex(255)) # 0xffперевод в любую систему счисления python код (перевод числа в любую систему счисления на python (код))
Возможные проблемы: при передаче неверной строки (например, "102" для двоичной) возникает ValueError. Для избежания ошибок следует проверять ввод или использовать блок try/except.
Цель использования: когда требуется быстрый перевод между системами, поддерживаемыми языком; подходит для большинства практических задач с основаниями 2, 8, 10, 16.
Как написать алгоритм перевода десятичного числа в любую систему счисления?
Для перевода в систему с основанием N (2-36) используется последовательное деление на N с сохранением остатков. Остатки преобразуются в символы (цифры или буквы).
def to_base(n, base):
digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
result = ""
if n == 0:
return "0"
while n > 0:
rem = n % base
result = digits[rem] + result
n //= base
return result
перевод в троичную систему счисления python (перевод числа в троичную систему счисления на python)
Пример вызова: print(to_base(255, 16)) выведет FF.
Типичные ошибки: неучет нуля (функция вернет пустую строку), выход за пределы алфавита при base > 36 (необходимо расширить строку digits). Для отрицательных чисел добавляется знак минус.
Случаи использования: когда требуется нестандартное основание (например, 12, 24) или когда нужно продемонстрировать принцип работы систем счисления.
Как реализовать обратное преобразование из любой системы в десятичную?
Метод Горнера: проход по строке слева направо, накопление результата умножением на основание и добавлением значения очередного символа.
def from_base(s, base):
digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
result = 0
for char in s:
value = digits.index(char)
result = result * base + value
return resultшестнадцатеричная система счисления python (шестнадцатеричная система счисления в python)
Пример: print(from_base("FF", 16)) вернет 255.
Проблемы: регистр букв (функция чувствительна к регистру, лучше переводить строку в верхний). Обработка недопустимых символов.
Случаи использования: чтение чисел из строк или файлов, где основание отлично от десятичного.
Как создать универсальную функцию для перевода между произвольными системами?
Сначала перевести исходную строку в десятичное число (через from_base), затем это число перевести в целевую систему (to_base).
def convert_base(number_str, from_base, to_base):
decimal = from_base(number_str, from_base)
return to_base(decimal, to_base)Пример: print(convert_base("FF", 16, 2)) выведет 11111111.
Сложности: при больших base > 36 нужно расширять алфавит; возможны проблемы с производительностью при очень длинных строках.
Назначение: для любых комбинаций оснований, когда не хочется писать отдельные функции для каждого случая.
Дополнительные примеры и расширенные реализации
Пример 1: Функция перевода с обработкой знака и проверкой основания
def to_base_signed(n, base, digits="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"):
if base < 2 or base > len(digits):
raise ValueError("Base out of range")
if n == 0:
return "0"
sign = ""
if n < 0:
sign = "-"
n = -n
result = ""
while n > 0:
result = digits[n % base] + result
n //= base
return sign + resultto_base_signed(255, 16) -> "FF" to_base_signed(-255, 16) -> "-FF" to_base_signed(123456789, 36) -> "21I3V"
Пример 2: Функция from_base с проверкой и словарем для ускорения
def from_base_fast(s, base):
digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
char_to_val = {c: i for i, c in enumerate(digits)}
s = s.upper()
result = 0
for ch in s:
if ch not in char_to_val:
raise ValueError(f"Invalid character {ch}")
result = result * base + char_to_val[ch]
return resultfrom_base_fast("ff", 16) -> 255
from_base_fast("21I3V", 36) -> 123456789Пример 3: Рекурсивная версия to_base (для оснований до 16)
def to_base_recursive(n, base):
digits = "0123456789ABCDEF"
if n < base:
return digits[n]
else:
return to_base_recursive(n // base, base) + digits[n % base]to_base_recursive(255, 16) -> "FF" to_base_recursive(10, 2) -> "1010"
Пример 4: Конвертация с использованием только встроенных функций
# Перевод из двоичной в шестнадцатеричную через int()
bin_str = "1010101111001101"
dec = int(bin_str, 2)
hex_str = hex(dec)[2:].upper()
print(hex_str) # "ABCD"ABCD
Пример 5: Сравнение производительности встроенных и ручных методов
import time
n = 10**1000
start = time.time()
hex_builtin = hex(n)
t1 = time.time() - start
start = time.time()
hex_manual = to_base(n, 16)
t2 = time.time() - start
print(f"Built-in: {t1:.6f} sec, Manual: {t2:.6f} sec")Built-in: 0.000002 sec, Manual: 0.000345 sec