Перетворіть двійкові, вісімкові та шістнадцяткові числа та рядки один від одного в Python

Бізнес

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
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