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 на основі основи. Якщо основання опущено, число вважається десятковим.
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