Конвертация чисел из разных систем счисления в десятичную с помощью 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