Перевод систем счисления в Python: встроенные функции и собственные алгоритмы

Раздел: Алгоритмы -> Системы счисления в 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 + result
to_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 result
from_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

Алгоритм перевода систем счисления на Python - comments

En
алгоритм перевода систем счисления python (python)