Двійкова, вісімкова та шістнадцяткова системи (також відомі як hex) - це різні системи числення з різними основами. Двійкова має основу 2, вісімкова - основу 8, а шістнадцяткова - основу 16. Звичайні цілі числа в Python мають основу 10. Двійкова, вісімкова та шістнадцяткова системи - це все різні подання цілих чисел. Це означає, що вони представляють додатні й відʼємні числа (включно з нулем) без дробів чи десяткових частин і підтримують усі операції, які ми можемо виконувати з цілими числами.
Двійкова система - це система числення з основою 2, яка використовує лише цифри 0 і 1. Вона зазвичай позначає стани 0 («вимкнено») та 1 («увімкнено») проходження струму через транзистори й перемикачі в компʼютерах, а також додатні та відʼємні заряди на магнітних носіях. Двійкова система може представити всі цілі числа, які використовуються в десятковій системі.
Фрагмент двійкової системи має такий вигляд, хоч насправді вона продовжується нескінченно і не зупиняється на 128:
| 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
|---|---|---|---|---|---|---|---|
| 2 ** 7 | 2 ** 6 | 2 ** 5 | 2 ** 4 | 2 ** 3 | 2 ** 2 | 2 ** 1 | 2 ** 0 |
Отже, якщо ми хочемо представити число 6 у двійковій системі, це буде 110.
| Розряд | 4 | 2 | 1 |
|---|---|---|---|
| Двійкове число | 1 | 1 | 0 |
А обчислення буде таким: 4 + 2 + 0 = 6
Ще один приклад: 19
| Розряд | 16 | 8 | 4 | 2 | 1 |
|---|---|---|---|---|---|
| Двійкове число | 1 | 0 | 0 | 1 | 1 |
Двійкове число буде: 10011
А обчислення буде таким: 16 + 0 + 0 + 2 + 1 = 19
У Python ми можемо записувати двійкові літерали за допомогою префікса 0b.
Якщо ми напишемо 0b10011, Python сприйме це як двійкове число й переведе його в десяткову систему.
>>> 0b10011
19
>>> type(0b10011)
<class 'int'>
Двійковий запис у Python - це просто інший спосіб записати ціле число, тому двійкове подання є цілим числом для всіх математичних операцій.
Якщо ми напишемо число з префіксом 0b, яке не належить двійковій системі, це викличе SyntaxError.
Traceback (most recent call last):
File "c:\binary.py", line 1, in <module>
0b10211
SyntaxError: invalid digit '2' in binary literal
Оскільки двійкові числа - це цілі числа, ми можемо виконувати над ними всі ті самі операції, що й з цілими числами.
# addition
>>> 0b10011 + 0b10011
38
# multiplication
>>> 0b10011 * 0b10011
361
Ми також можемо виконувати операції між двійковим і цілочисельним поданнями.
Однак діють звичайні правила математичних операторів: ділення двох двійкових чи цілих чисел поверне float, навіть якщо результат ділення не має десяткової частини.
>>> 0b10011 + 19
38
>>> 0b10011/0b10011
1.0
>>> 0b10011/3
6.333333333333333
Python автоматично перетворює двійковий літерал на int.
Щоб перетворити int на двійкове подання, скористаймося вбудованою функцією [bin()][bin].
bin() поверне str з двійковим еквівалентом і префіксом 0b .
>>> bin(19)
'0b10011'
Щоб перетворити двійковий літерал на ціле число, ми можемо скористатися вбудованою функцією int() і передати рядок тексту (англ. string) з двійковим поданням та аргумент основи:
>>> int("0b10011", 2)
19
Якщо вказати неправильну основу (або некоректне двійкове подання), це викличе ValueError:
Traceback (most recent call last):
File "c:\binary.py", line 4, in <module>
int("0b10011", 3)
ValueError: invalid literal for int() with base 3: '0b10011'
Існують також спеціальні методи, які ми можемо застосовувати до двійкових чисел.
<int>.bit_length() поверне кількість бітів, потрібних для подання числа:
>>> 0b11011.bit_length()
5
<int>.bit_count() поверне кількість одиниць у двійковому числі.
Наприклад, bit_count() для '0b11011' поверне 4:
>>> 0b11011.bit_count()
4
Якщо ми працюємо локально, bit_count() потребує щонайменше Python 3.10.
Онлайн-редактор Exercism наразі підтримує всі можливості до Python 3.11 включно.
Вісімкова система - це система числення з основою 8. Вона використовує цифри 0, 1, 2, 3, 4, 5, 6 і 7.
У Python ми можемо записувати вісімкові числа за допомогою префікса 0o.
Як і з двійковою системою, Python автоматично перетворює вісімкове подання на int.
>>> 0o123
83
Як і двійкові, вісімкові числа є цілими числами й підтримують усі операції з цілими числами.
Якщо додати префікс 0o до числа, яке не належить вісімковій системі, це викличе SyntaxError.
Щоб перетворити int на вісімкове подання, ми можемо скористатися вбудованою функцією [oct()][oct].
Вона працює подібно до функції bin() і повертає рядок тексту:
>>> oct(83)
'0o123'
Щоб перетворити вісімкове число на ціле, ми можемо скористатися функцією int(), передавши вісімкове подання у вигляді рядка тексту та основу (8) як аргументи:
>>> int("0o123", 8)
83
Як і у випадку з двійковою системою, неправильна основа викличе ValueError.
Шістнадцяткова система - це система числення з основою 16. Вона використовує цифри 0 - 9 і літери A, B, C, D, E та F. A дорівнює 10, B - 11, C - 12, D - 13, E - 14, а F - 15.
У Python ми можемо записувати шістнадцяткові числа за допомогою префікса 0x.
Як і з двійковою та вісімковою системами, Python автоматично перетворює шістнадцяткові літерали на int.
>>> 0x123
291
Як і з двійковою та вісімковою системами, шістнадцяткові літерали є цілими числами, і ми можемо виконувати з ними всі операції з цілими числами.
Якщо додати префікс 0x до числа, яке не є шістнадцятковим, це викличе SyntaxError.
Щоб перетворити int на шістнадцяткове подання, ми можемо скористатися вбудованою функцією [hex()][hex].
Вона працює подібно до функції bin() і повертає рядок тексту:
>>> hex(291)
'0x123'
Щоб перетворити шістнадцяткове подання на ціле число, ми можемо скористатися функцією int(), передавши шістнадцятковий рядок тексту та основу (16) як аргументи:
>>> int("0x123", 16)
291
Як і у випадку з двійковою та вісімковою системами, неправильна основа викличе ValueError.