Python может работать с числами и строками как с двоичными, восьмеричными и шестнадцатеричными числами, так и с обычными десятичными. Их также легко конвертировать между собой.
В этом разделе будет объяснено следующее содержание вместе с примером кода.
- Записывайте целые числа в двоичной, восьмеричной и шестнадцатеричной системах счисления.
- Преобразование чисел в строки в двоичной, восьмеричной и шестнадцатеричной системе счисления.
- встроенная функция (например, в языке программирования)
bin()
,oct()
,hex()
- строковый метод
str.format()
, Встроенные функцииformat()
, f строка - Преобразование отрицательного целого числа в строку в формате двойного дополнения.
- встроенная функция (например, в языке программирования)
- Преобразование строк в двоичной, восьмеричной и шестнадцатеричной нотации в числа.
- встроенная функция (например, в языке программирования)
int()
- встроенная функция (например, в языке программирования)
- Примеры применения
- Двоичная строковая арифметика
- Преобразование между двоичными, восьмеричными и шестнадцатеричными числами
Записывайте целые числа в двоичной, восьмеричной и шестнадцатеричной системах счисления.
Добавляя следующие префиксы, целые числа int могут быть записаны в двоичной, восьмеричной и шестнадцатеричной системах счисления соответственно.
Вы также можете использовать заглавные буквы.
- Двоичное число:
0b
или0B
- Октал:
0o
или0O
- Шестнадцатеричное число:
0x
или0X
Вывод print() будет в десятичной системе счисления.
bin_num = 0b10
oct_num = 0o10
hex_num = 0x10
print(bin_num)
print(oct_num)
print(hex_num)
# 2
# 8
# 16
Bin_num = 0B10
Oct_num = 0O10
Hex_num = 0X10
print(Bin_num)
print(Oct_num)
print(Hex_num)
# 2
# 8
# 16
Даже с префиксом тип является целым числом int.
print(type(bin_num))
print(type(oct_num))
print(type(hex_num))
# <class 'int'>
# <class 'int'>
# <class 'int'>
print(type(Bin_num))
print(type(Oct_num))
print(type(Hex_num))
# <class 'int'>
# <class 'int'>
# <class 'int'>
Поскольку это целочисленный тип, его можно использовать для обычных арифметических операций.
result = 0b10 * 0o10 + 0x10
print(result)
# 32
Начиная с Python 3.6, в числа можно вставлять символы подчеркивания _. Повторение символа подчеркивания _ приведет к ошибке, но вы можете вставлять его сколько угодно, лишь бы он не повторялся.
Подчеркивание _ не влияет на число, поэтому его можно использовать в качестве разделителя, когда цифр много. Например, вставка подчеркивания _ через каждые четыре цифры легко читается.
print(0b111111111111 == 0b1_1_1_1_1_1_1_1_1_1_1_1)
# True
bin_num = 0b1111_1111_1111
print(bin_num)
# 4095
Преобразование чисел в строки в двоичной, восьмеричной и шестнадцатеричной системе счисления.
Чтобы преобразовать число в строку в двоичной, восьмеричной или шестнадцатеричной системе счисления, используйте следующие встроенные функции.
- встроенная функция (например, в языке программирования)
bin()
,oct()
,hex()
- строковый метод
str.format()
, Встроенные функцииformat()
, f строка
В этом разделе также объясняется, как получить строку, выраженную в формате двойного дополнения для отрицательных значений.
Встроенные функции bin(), oct(), hex()
Следующие встроенные функции могут преобразовывать числа в двоичные, восьмеричные и шестнадцатеричные строки.
- Двоичное число:
bin()
- Октал:
oct()
- Шестнадцатеричное число:
hex()
Каждый из них возвращает строку со следующими префиксами
- Двоичное число:
0b
- Октал:
0o
- Шестнадцатеричное число:
0x
- bin() — Built-in Functions — Python 3.10.0 Documentation
- oct() — Built-in Functions — Python 3.10.0 Documentation
- hex() — Built-in Functions — Python 3.10.0 Documentation
i = 255
print(bin(i))
print(oct(i))
print(hex(i))
# 0b11111111
# 0o377
# 0xff
print(type(bin(i)))
print(type(oct(i)))
print(type(hex(i)))
# <class 'str'>
# <class 'str'>
# <class 'str'>
Если вам не нужен префикс, используйте slice[2:] для извлечения строки, стоящей за ним, или используйте format(), как объясняется далее.
print(bin(i)[2:])
print(oct(i)[2:])
print(hex(i)[2:])
# 11111111
# 377
# ff
Если вы хотите преобразовать его в десятичную строку, вы можете использовать str().
print(str(i))
# 255
print(type(str(i)))
# <class 'str'>
Встроенная функция format(), строковый метод str.format(), f строка
Встроенная функция format() и строковые методы str.format() и f-string также могут преобразовывать числа в двоичные, восьмеричные и шестнадцатеричные строки.
Указав второй аргумент format() следующим образом, его можно преобразовать в двоичную, восьмеричную и шестнадцатеричную строки соответственно.
- Двоичное число:
b
- Октал:
o
- Шестнадцатеричное число:
x
print(format(i, 'b'))
print(format(i, 'o'))
print(format(i, 'x'))
# 11111111
# 377
# ff
print(type(format(i, 'b')))
print(type(format(i, 'o')))
print(type(format(i, 'x')))
# <class 'str'>
# <class 'str'>
# <class 'str'>
Если вы хотите получить строку с префиксом 0b,0o,0x, добавьте # к строке спецификации форматирования.
print(format(i, '#b'))
print(format(i, '#o'))
print(format(i, '#x'))
# 0b11111111
# 0o377
# 0xff
Также можно заполнить 0 любым количеством цифр. Обратите внимание, что при заполнении нуля префиксом необходимо учитывать количество символов для префикса (два символа).
print(format(i, '08b'))
print(format(i, '08o'))
print(format(i, '08x'))
# 11111111
# 00000377
# 000000ff
print(format(i, '#010b'))
print(format(i, '#010o'))
print(format(i, '#010x'))
# 0b11111111
# 0o00000377
# 0x000000ff
Для преобразования также можно использовать строковый метод str.format().
print('{:08b}'.format(i))
print('{:08o}'.format(i))
print('{:08x}'.format(i))
# 11111111
# 00000377
# 000000ff
Начиная с Python 3.6, вы также можете использовать строку f.f'xxx'
print(f'{i:08b}')
print(f'{i:08o}')
print(f'{i:08x}')
# 11111111
# 00000377
# 000000ff
Преобразование отрицательного целого числа в строку в формате двойного дополнения.
Когда отрицательное целое число преобразуется в двоичную или шестнадцатеричную строку с помощью bin() или format(), абсолютное значение будет иметь знак минус.
x = -9
print(x)
print(bin(x))
# -9
# -0b1001
В Python побитовые операции над отрицательными целыми числами также выполняются в представлении двух дополнений. Поэтому, если вы хотите получить строку, выраженную в форме дополнения двойки, вы можете выполнить побитовое логическое ИЛИ& с максимальным количеством необходимых битовых разрядов, как показано ниже.
- 4bit:
0b1111(=0xf)
- 8bit:
0xff
- 16bit:
0xffff
print(bin(x & 0xff))
print(format(x & 0xffff, 'x'))
# 0b11110111
# fff7
Преобразование строк в двоичной, восьмеричной и шестнадцатеричной нотации в числа.
Встроенная функция int()
Чтобы преобразовать строку в двоичной, восьмеричной или шестнадцатеричной нотации в число, используйте встроенную функцию int().
С помощью int(string, radix) строка str в двоичной, восьмеричной, шестнадцатеричной и т.д. нотации может быть преобразована в числовое значение int на основе radix. Если радикс опущен, число будет считаться десятичным.
print(int('10'))
print(int('10', 2))
print(int('10', 8))
print(int('10', 16))
# 10
# 2
# 8
# 16
print(type(int('10')))
print(type(int('10', 2)))
print(type(int('10', 8)))
print(type(int('10', 16)))
# <class 'int'>
# <class 'int'>
# <class 'int'>
# <class 'int'>
Если радикс установлен в 0, преобразование выполняется на основе следующего префикса строки.
- Двоичный префикс:
0b
или0B
- Октальный префикс:
0o
или0O
- Шестнадцатеричный префикс:
0x
или0X
print(int('0b10', 0))
print(int('0o10', 0))
print(int('0x10', 0))
# 2
# 8
# 16
print(int('0B10', 0))
print(int('0O10', 0))
print(int('0X10', 0))
# 2
# 8
# 16
Если базовое число равно 0 и нет префикса, оно будет преобразовано как десятичное число, но обратите внимание, что если начало (левая часть) заполнено 0, произойдет ошибка.
print(int('10', 0))
# 10
# print(int('010', 0))
# ValueError: invalid literal for int() with base 0: '010'
В других случаях строки с нулевым заполнением могут быть преобразованы как есть.
print(int('010'))
# 10
print(int('00ff', 16))
print(int('0x00ff', 0))
# 255
# 255
Если строка не может быть преобразована с указанным радиксом или префиксом, возникает ошибка.
# print(int('ff', 2))
# ValueError: invalid literal for int() with base 2: 'ff'
# print(int('0a10', 0))
# ValueError: invalid literal for int() with base 0: '0a10'
# print(int('0bff', 0))
# ValueError: invalid literal for int() with base 0: '0bff'
Примеры применения
Двоичная строковая арифметика
Например, для выполнения операции над строкой в двоичной нотации с префиксом 0b.
Вы можете легко преобразовать его в числовое значение (целочисленный тип int), выполнить над ним операции, а затем снова преобразовать его в строку str.
a = '0b1001'
b = '0b0011'
c = int(a, 0) + int(b, 0)
print(c)
print(bin(c))
# 12
# 0b1100
Преобразование между двоичными, восьмеричными и шестнадцатеричными числами
Также легко преобразовать двоичные, восьмеричные и шестнадцатеричные строки друг в друга. После преобразования в числовое значение int его можно преобразовать в строку любого формата.
Заполнение нулями, префиксация и т.д. могут контролироваться строкой спецификации форматирования.
a_0b = '0b1110001010011'
print(format(int(a, 0), '#010x'))
# 0x00000009
print(format(int(a, 0), '#010o'))
# 0o00000011