Шаг 48.
Python: сборник рецептов. Числа, даты и время. Работа с бинарными, восьмеричными и шестнадцатеричными целыми числами

    На этом шаге мы рассмотрим функции, предназначенные для работы с этими числами.

Задача

    Вам нужно преобразовать выводимые целые числа в бинарное, восьмеричное или шестнадцатеричное представление.

Решение

    Чтобы преобразовать целое число в бинарное, восьмеричное или шестнадцатеричное представление, используйте функции bin(), oct() или hex() соответственно:

>>> x = 1234
>>> bin(x)
'0b10011010010'
>>> oct(x)
'0o2322'
>>> hex(x)
'0x4d2'
>>>

    Или вы можете использовать функцию format(), если не хотите, чтобы появлялись префиксы 0b, 0o или 0x. Например:

>>> format(x, 'b')
'10011010010'
>>> format(x, 'o')
'2322'
>>> format(x, 'x')
'4d2'
>>>

    Целые числа имеют знак, поэтому если вы работаете с отрицательными значениями, то вывод также будет включать знак. Например:

>>> x = -1234 
>>> format(x, 'b')
'-10011010010'
>>> format(x, 'x')
'-4d2'
>>>

    Если вы хотите вывести значение без знака, вам нужно добавить максимальное значение, чтобы установить длину бита. Например, чтобы вывести 32-битное значение, можно поступить так:

>>> x = -1234
>>> format(2 ** 32 + x, 'b')
'11111111111111111111101100101110'
>>> format(2 ** 32 + x, 'x')
'fffffb2e'
>>> 

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

>>> int('4d2', 16)
1234
>>> int('10011010010', 2)
1234
>>> 


Обсуждение

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

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

>>> import os
>>> os.chmod('script.py', 0755)
SyntaxError: leading zeros in decimal integer literals are not permitted; 
use an 0o prefix for octal integers

    Убедитесь, что вы вводите восьмеричное значение с префиксом 0o, как показано тут:

>>> os.chmod('script.py', 0o755)
>>>

    На следующем шаге мы рассмотрим упаковку и распаковку больших целых чисел из байтовых строк.




Предыдущий шаг Содержание Следующий шаг