Конвертация чисел из разных систем счисления в десятичную с помощью Python

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

Перевод чисел в десятичную систему с помощью Python

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

Самый простой и эффективный способ - использовать встроенную функцию int() с указанием основания. Функция принимает строку и основание (от 2 до 36) и возвращает десятичное число.


binary_str = '1010'
decimal = int(binary_str, 2)
print(decimal)

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

10

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

Аналогично для восьмеричной (int('12', 8) даёт 10) и шестнадцатеричной (int('a', 16) даёт 10).

Если передать основание 0, Python автоматически определит систему по префиксу: 0b для двоичной, 0o для восьмеричной, 0x для шестнадцатеричной.


print(int('0b1010', 0))
print(int('0o12', 0))
print(int('0xa', 0))

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

10
10
10

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

При неверных символах возникает ValueError. Рекомендуется оборачивать вызов в try-except.

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

Этот метод помогает понять алгоритм преобразования. Перебираем цифры справа налево, умножаем цифру на основание в степени позиции.


def bin_to_dec(bin_str):
    result = 0
    for i, digit in enumerate(reversed(bin_str)):
        result += int(digit) * (2 ** i)
    return result

print(bin_to_dec('1010'))

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

10

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

Для оснований больше 10 необходимо преобразовывать буквы A-F в числа. Можно использовать int(digit, 36) или словарь.

Как использовать functools.reduce?

Функциональный подход: свёртка строки с накоплением результата.


from functools import reduce
bin_str = '1010'
dec = reduce(lambda acc, d: acc*2 + int(d), bin_str, 0)
print(dec)
10

Как применить sum и enumerate?


bin_str = '1010'
dec = sum(int(d) * (2**i) for i, d in enumerate(reversed(bin_str)))
print(dec)
10

Можно ли использовать eval?

Теоретически можно, но это опасно и не рекомендуется. Пример для двоичной:


bin_str = '1010'
dec = eval('0b' + bin_str)
print(dec)
10

Внимание:

eval выполняет произвольный код, поэтому использовать его с непроверенным вводом нельзя.

Как использовать int с основанием 0?

Уже рассмотрено в основном способе: int('0b1010', 0) автоматически распознаёт префикс.

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

Функция int не поддерживает дробные числа. Необходимо написать собственную функцию, разделяющую целую и дробную части.


def bin_frac_to_dec(bin_str):
    if '.' in bin_str:
        int_part, frac_part = bin_str.split('.')
        dec = int(int_part, 2)
        for i, d in enumerate(frac_part):
            dec += int(d) * (2 ** (-(i+1)))
        return dec
    else:
        return int(bin_str, 2)

print(bin_frac_to_dec('101.1'))
5.5

Типичные ошибки и их решения

  • ValueError: invalid literal for int() with base ... - строка содержит символы, недопустимые для данного основания. Решение: проверять строку с помощью all или регулярных выражений.
  • ValueError: int() base must be >= 2 and <= 36, or 0 - указано некорректное основание. Решение: контролировать значение base.
  • Наличие пробелов и лишних символов - строку нужно очищать методами .strip(), .replace(' ', '').
  • Дробные числа - int не поддерживает точку. Решение: реализовать отдельную функцию, как показано выше.
  • eval с пользовательским вводом - уязвимость. Решение: не использовать eval.
  • Некорректное автоопределение (base=0) - если нет префикса, возникнет ошибка. Решение: добавлять префикс вручную или использовать явное основание.

Расширенный пример 1: универсальная функция с обработкой ошибок

Эта функция принимает строку и основание (2-36) и возвращает десятичное число, обрабатывая возможные исключения.

Пример

def any_base_to_dec(s, base):
    try:
        s = s.strip()
        return int(s, base)
    except ValueError as e:
        print(f'Ошибка: {e}')
        return None

print(any_base_to_dec('FF', 16))
print(any_base_to_dec('77', 8))
print(any_base_to_dec('101', 2))
print(any_base_to_dec('123', 4))
255
63
5
27

Расширенный пример 2: алгоритм ручного перевода для произвольного основания (демонстрация)

Реализация без использования int, с явным перебором цифр и использованием словаря для букв.

Пример

def manual_convert(s, base):
    digits = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
    s = s.upper()
    dec = 0
    for ch in s:
        dec = dec * base + digits.index(ch)
    return dec

print(manual_convert('1010', 2))
print(manual_convert('FF', 16))
print(manual_convert('1A', 16))
10
255
26

Расширенный пример 3: перевод дробных чисел из шестнадцатеричной системы

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

Пример

def frac_to_dec(s, base):
    if '.' not in s:
        return int(s, base)
    int_part, frac_part = s.upper().split('.')
    dec = int(int_part, base)
    for i, d in enumerate(frac_part):
        dec += int(d, base) * (base ** (-(i+1)))
    return dec

print(frac_to_dec('1A.8', 16))
print(frac_to_dec('11.1', 2))
26.5
3.5

Расширенный пример 4: использование битовых операций для двоичной строки

Быстрый способ для двоичных чисел: сдвиги и побитовое ИЛИ.

Пример

def bin_by_shift(bin_str):
    val = 0
    for ch in bin_str:
        val = (val << 1) | (1 if ch == '1' else 0)
    return val

print(bin_by_shift('1010'))
print(bin_by_shift('11111111'))
10
255

Расширенный пример 5: пакетная конвертация чисел из списка строк с разными префиксами

Полезно при обработке данных из внешних источников.

Пример

strings = ['0b1010', '0o12', '0xA', '123']
results = []
for s in strings:
    try:
        results.append(int(s, 0))
    except ValueError:
        # если нет префикса, считаем десятичным
        results.append(int(s, 10))
print(results)
[10, 10, 10, 123]

Расширенный пример 6: валидация строки с помощью регулярного выражения

Проверка, что строка содержит только допустимые символы для двоичной системы, перед конвертацией.

Пример

import re
def safe_bin_convert(s):
    if not re.fullmatch(r'[01]+', s):
        raise ValueError('Строка должна содержать только 0 и 1')
    return int(s, 2)

print(safe_bin_convert('1010'))
# print(safe_bin_convert('1012'))  # раскомментировать для проверки ошибки
10

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

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