Системы счисления в Python: перевод в десятичную, двоичную и любую другую

Чтобы перевести число в десятичную систему счисления в Python, достаточно функции int() с основанием вторым аргументом.

Обратно в двоичную, восьмеричную и шестнадцатеричную переводят bin(), oct() и hex(), а для троичной и любой другой системы нужна короткая функция с циклом while.

Ниже рабочий код для каждого случая, дроби и частые ошибки.

Статью написал:
Ваня Буявец, продюсер, основатель Checkroi
Ваня Буявец
Основатель Checkroi, продюсер, эксперт в выборе онлайн-курсов
Все 2945 статей автора Подписаться на Телеграм-канал
Одобрено экспертом:
Наташа Буявец, основатель Checkroi, эксперт по онлайн-курсам
Наташа Буявец
Основательница Checkroi, продюсер Youtube-каналов, эксперт по онлайн-курсам
Все 3599 экспертных мнений Подписаться на Телеграм-канал
Обложка: Системы счисления в Python: перевод в десятичную, двоичную и любую другую

Чтобы перевести число в десятичную систему счисления в Python, передайте его строкой в int() и вторым аргументом укажите основание: int('1011', 2) вернёт 11, int('ff', 16) вернёт 255. Обратно, из десятичной в двоичную, восьмеричную и шестнадцатеричную, переводят встроенные bin(), oct() и hex().

Для троичной, четверичной и любой другой системы готовой функции в языке нет. Её пишут сами, это пять строк с циклом while и операторами % и //. Если операторы Python пока путаются, начните с них, ниже они понадобятся.

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

Рой за ноутбуком переводит число в Python

Примеры ниже запускаются в любом редакторе, удобнее всего в VS Code: как создать и запустить файл Python в VS Code, мы разбирали отдельно.

Всю работу делает встроенная функция int(). У неё два аргумента: строка с записью числа и основание системы, из которой переводим.

  1. Запишите число строкой, в кавычках: '1011', а не 1011.
  2. Вторым аргументом передайте основание: 2, 3, 8, 16 и так далее.
  3. Получите обычное целое число в десятичной системе, с ним уже можно считать.
print(int('1011', 2))   # из двоичной
print(int('17', 8))     # из восьмеричной
print(int('ff', 16))    # из шестнадцатеричной
print(int('FF', 16))    # регистр букв не важен
print(int('2101', 3))   # из троичной
print(int('z', 36))     # максимальное основание
11
15
255
255
64
35

Основание может быть от 2 до 36. Цифр в десятичной системе десять, поэтому после 9 идут латинские буквы: A значит 10, F значит 15, Z значит 35. Букв в алфавите 26, отсюда и потолок в 36.

Что int() делает внутри: перевод через развёрнутую форму

Полезно понимать, что функция считает за вас, иначе ответ нечем проверить. Каждая цифра умножается на основание в степени своей позиции, позиции считаются справа и с нуля. Для троичного 2101:

2·3³ + 1·3² + 0·3¹ + 1·3⁰ = 54 + 9 + 0 + 1 = 64

Та же формула на Python укладывается в одну строку. Пригодится, если преподаватель просит решить без int():

s = '2101'
print(sum(int(d) * 3 ** i for i, d in enumerate(reversed(s))))
64

Бывает, что двоичное число хранится не строкой, а списком битов, например [1, 0, 1, 1]. Тогда сначала склеиваем его в строку, а потом отдаём в int():

bits = [1, 0, 1, 1]
print(int(''.join(map(str, bits)), 2))
11

Если у числа есть префикс 0b, 0o или 0x

Строку вида '0b1011' или '0xff' можно разобрать с основанием 0. Тогда Python сам поймёт систему по префиксу, как в записи числа прямо в коде.

print(int('0b1011', 0))
print(int('0xff', 0))
print(int('  1011  ', 2))      # пробелы по краям не мешают
print(int('1_0000_0000', 2))   # подчёркивания между цифрами тоже
print(0b1011, 0o17, 0xff)      # литералы в коде уже десятичные числа
11
255
11
256
11 15 255

Последняя строка показывает частую путаницу. Если число записано в коде литералом 0b1011, переводить его не нужно: для Python это уже 11, просто записанное по-другому.

Из десятичной в двоичную, восьмеричную и шестнадцатеричную

Для трёх самых популярных систем есть готовые функции. Они возвращают строку с префиксом, который часто приходится отрезать срезом [2:].

Система Функция Результат для 202 Без префикса
Двоичная bin(n) 0b11001010 format(n, 'b')
Восьмеричная oct(n) 0o312 format(n, 'o')
Шестнадцатеричная hex(n) 0xca format(n, 'x') или 'X'
n = 202
print(bin(n), oct(n), hex(n))
print(bin(n)[2:], oct(n)[2:], hex(n)[2:])
print(format(n, 'b'), format(n, 'X'))
print(f'{n:010b}')   # дополнить нулями до 10 знаков
0b11001010 0o312 0xca
11001010 312 ca
11001010 CA
0011001010

Вариант с format() и f-строкой удобнее, когда нужна запись фиксированной длины, например байт из восьми бит. Не путайте эти функции с кодировкой Base64: она превращает байты в текст и к переводу числа между системами отношения не имеет. Все коды формата перечислены в описании мини-языка форматирования в документации Python.

CheckroiCheckroiПодборка курсов по Python566 курсов • 51 школаСравните цены, школы, программу и найдите выгодные предложения по обучениюСравнить→ Канал основателя Checkroi Вани Буявца3 700 человек читают мой Телеграм-канал про нейросетиСобрал промпты для Claude Code и ChatGPT, разборы ИИ-инструментов и лайфхаки по продвижению бизнеса в одном местеПрисоединиться

Перевод в троичную и любую другую систему счисления

Рой у лестницы из кубиков, которые складываются в новое число

Для основания 3, 4, 5 и дальше встроенной функции нет. Работает школьный алгоритм: делим число на основание, записываем остаток, повторяем с частным, пока не дойдём до нуля. Остатки, прочитанные снизу вверх, и есть запись числа.

Вот как это выглядит для числа 64 в троичной системе, в самом коротком виде:

n = 64
r = ''
while n > 0:
    r = str(n % 3) + r   # остаток дописываем слева
    n //= 3              # переходим к частному
print(r)
2101

Тот же приём работает для четверичной, пятеричной и семеричной систем, меняется только тройка. Как устроен сам цикл, подробно разобрано в статье про цикл while в Python.

Универсальная функция для любого основания до 36

У короткой версии три слабых места. Для нуля она вернёт пустую строку, отрицательные числа не обработает, а при основании больше 10 вместо букв напишет двузначные остатки. Функция ниже закрывает все три случая:

DIGITS = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'

def to_base(n, base):
    if n == 0:
        return '0'
    sign = '-' if n < 0 else ''
    n = abs(n)
    digits = ''
    while n > 0:
        digits = DIGITS[n % base] + digits
        n //= base
    return sign + digits

print(to_base(64, 3))
print(to_base(255, 4))
print(to_base(100, 7))
print(to_base(0, 3))
print(to_base(-64, 3))
print(int(to_base(64, 3), 3))   # проверка обратным переводом
2101
3333
202
0
-2101
64

Последняя строка стоит того, чтобы её запомнить. Перевели, потом вернули обратно через int(): если получилось исходное число, функция написана верно.

Из одной недесятичной системы в другую

Прямого перевода, скажем, из троичной в пятеричную в Python нет, и он не нужен. Идём через десятичную: int() разбирает исходную запись, to_base() собирает новую.

def convert(s, from_base, to):
    return to_base(int(s, from_base), to)

print(convert('2101', 3, 5))
print(convert('FF', 16, 2))
224
11111111

Если установлен NumPy

В библиотеке NumPy есть готовая функция base_repr(), она переводит в систему с основанием до 36. Тянуть NumPy ради одной функции нет смысла, но если он уже стоит в проекте, это одна строка.

CheckroiCheckroiПодборка курсов по NumPy78 курсов • 18 школСравните цены, школы, программу и найдите выгодные предложения по обучениюСравнить→
import numpy as np
print(np.base_repr(64, base=3))
print(np.base_repr(255, base=16))
2101
FF

Пример задачи на системы счисления в стиле ЕГЭ

В школьной информатике перевод в троичную и другие системы почти никогда не нужен сам по себе. Обычно надо перебрать много чисел и проверить что-то в их записи. Возьмём такую задачу:

Сколько чисел от 1 до 1000 содержат в троичной записи ровно две цифры 2?

Руками перебирать тысячу чисел долго, а в Python это пять строк поверх функции to_base():

count = 0
for n in range(1, 1001):
    if to_base(n, 3).count('2') == 2:
        count += 1
print(count)
326

Ответ легко проверить вторым способом: замените to_base(n, 3) на np.base_repr(n, 3). Совпали ответы двух разных функций, значит, ошибки в вашем коде нет. Если вы готовитесь к поступлению на IT-специальность, в статье что сдавать на Python-разработчика собраны предметы и пути после 9 и 11 класса. А если хочется разобрать язык глубже школьной программы, загляните в подборку курсов по Python с ценами и сроками.

Дробные числа: что умеет int() и что нет

int() переводит только целые числа. Строка '1.5' или '0.101' вызовет ошибку при любом основании. Для дробной части работает обратный школьный алгоритм: умножаем на основание и забираем целую часть.

def frac_to_base(x, base, k=8):
    digits = ''
    for _ in range(k):
        x *= base
        d = int(x)
        digits += str(d)
        x -= d
        if x == 0:
            break
    return '0.' + digits

print(frac_to_base(0.625, 2))
print(frac_to_base(0.1, 2, 10))
0.101
0.0001100110

Число 0,625 записалось в двоичной системе точно, а 0,1 нет: двоичная дробь у него бесконечная, и мы обрезали её на десяти знаках. По этой же причине в Python 0.1 + 0.2 не равно ровно 0,3. Когда важна точная десятичная арифметика, например в денежных расчётах, используют модуль decimal.

Частые ошибки при переводе систем счисления

Рой с чек-листом уверенно обходит грабли
Что видите Почему Что сделать
ValueError: invalid literal for int() with base 2: '102' В записи есть цифра, которой нет в этой системе: в двоичной только 0 и 1 Проверьте основание и саму строку
TypeError: int() can't convert non-string with explicit base Передали число вместо строки: int(1011, 2) Возьмите запись в кавычки или оберните в str()
ValueError: int() base must be >= 2 and <= 36, or 0 Основание вне допустимого диапазона Для систем больше 36 нужна своя таблица цифр
ValueError: invalid literal for int() with base 10: '0b1011' Префикс есть, а основание указано другое или не указано Передайте основание 0 или 2
Своя функция выдаёт число задом наперёд Остатки дописывали справа: r = r + str(n % 3) Дописывайте слева или разверните строку срезом [::-1]
Для нуля получается пустая строка Цикл while n > 0 не выполнился ни разу Добавьте отдельную проверку на 0, как в to_base()

Ещё одна ловушка с bin(): для отрицательного числа она возвращает -0b101, то есть знак плюс модуль. Это не дополнительный код, который рисуют в задачах про устройство памяти. Если нужен именно он, берут маску: format(-5 & 0xFF, '08b') даст 11111011.

Ваня БуявецКанал основателя Checkroi Вани БуявцаЗабирайте промпты и обучение по нейросетям в моём Телеграм-каналеБольше 3 700 человек уже применяют Claude Code, ChatGPT и другие нейросети в работе, учёбе, бизнесе и жизниПерейти в канал

Где освоить Python системно

Перевод между системами счисления закрывает одну маленькую задачу. Чтобы писать на Python уверенно, нужны типы данных, функции, работа с файлами и библиотеками, и всё это удобнее собирать на курсе, где проверяют домашние задания. Если хочется сначала потренироваться самостоятельно, начните с 30 задач по Python для начинающих.

Ниже пять курсов из нашего каталога, а все программы с ценами и сроками собраны на странице онлайн-курсов по Python.

КурсШколаСтоимость со скидкойВ рассрочкуДлитель­ностьОбзор курса от Checkroi
Профессия «Python-разработчик»
Перейти на сайт курса
SkillboxSkillbox157 335 ₽5987 ₽/мес.10 месяцевОбзор курса
Fullstack-разработчик на Python
Перейти на сайт курса
НетологияНетология137 011 ₽7125 ₽/мес.21 месяцОбзор курса
ДО Профессия Python-разработчик
Перейти на сайт курса
GeekBrainsGeekBrains149 001 ₽3167 ₽/мес.10 месяцевОбзор курса
Автоматизированное тестирование на Python
Перейти на сайт курса
SkillboxSkillbox118 666 ₽4108 ₽/мес.9 месяцевОбзор курса
Программирование на Python ПРО
Перейти на сайт курса
SkillboxSkillbox119 600 ₽ - 17 месяцевОбзор курса

Больше программ — в полном каталоге курсов по Python

Часто задаваемые вопросы

Как перевести число в десятичную систему счисления в питоне?

Передайте запись числа строкой в функцию int() и укажите основание вторым аргументом: int('1011', 2) вернёт 11, int('2101', 3) вернёт 64. Основание может быть от 2 до 36.

Как перевести число из десятичной в двоичную систему в Python?

Функция bin(n) вернёт строку с префиксом 0b, например bin(202) даст '0b11001010'. Без префикса запись даёт format(n, 'b') или срез bin(n)[2:].

Есть ли в Python функция для перевода в троичную систему счисления?

Встроенной нет: bin(), oct() и hex() работают только с основаниями 2, 8 и 16. Для троичной и любой другой системы пишут короткую функцию с циклом while, которая делит число на основание и собирает остатки. Если в проекте есть NumPy, подойдёт np.base_repr(n, 3).

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

Через десятичную: сначала int(s, 3) превращает запись в обычное число, затем своя функция переводит его в пятеричную. Например, троичное 2101 в пятеричной системе записывается как 224.

Почему int() выдаёт ошибку invalid literal for int() with base 2?

В строке есть цифра, которой нет в этой системе, например 2 в двоичной записи '102'. Проверьте основание и саму запись. Ошибка TypeError с текстом can't convert non-string with explicit base означает, что передали число, а не строку.

Можно ли перевести дробное число в другую систему счисления через int()?

Нет, int() работает только с целыми числами, строка '0.101' вызовет ошибку. Дробную часть переводят вручную: умножают на основание и забирают целую часть, пока дробь не кончится или не наберётся нужное число знаков.

Читайте Checkroi первым в Google
Добавьте Checkroi в избранные источники — и наши разборы курсов и обзоры школ будут показываться выше в вашей выдаче Google.
Оставить комментарий
0 комментариев
Форма комментария

Оставьте комментарий

Напишите, что думаете. Нам важно ваше мнение!