Как записывать числа: системы счисления
Десятичная система — не единственная. Разберём двоичную, восьмеричную и шестнадцатеричную запись — и зачем они вообще нужны программисту.
Мы привыкли записывать числа в десятичной системе (base 10) — десять цифр, от 0 до 9. Но это не единственный способ, и компьютеры часто используют другие системы счисления.
Четыре системы, с которыми вы встретитесь
| Система | Основание | Цифры | Python-литерал |
|---|---|---|---|
| Десятичная (decimal) | 10 | 0–9 | 10 |
| Двоичная (binary) | 2 | 0–1 | 0b1010 |
| Восьмеричная (octal) | 8 | 0–7 | 0o12 |
| Шестнадцатеричная (hexadecimal) | 16 | 0–9, A–F | 0xA |
Как читать позиционную запись
В любой системе счисления каждая позиция цифры имеет свой «вес» — степень основания.
Возьмём двоичное число 1010:
Ровно тот же принцип работает и для десятичной системы, которой вы пользуетесь каждый день — просто вес позиций там 1000, 100, 10, 1 (степени десяти), а не степени двойки.
Зачем программисту шестнадцатеричная система
Шестнадцатеричная запись встречается на практике куда чаще, чем кажется:
- Цвета в вебе и графике:
#FF0000— ярко-красный; - Байтовые/битовые шаблоны — компактная запись двоичных данных;
- Сетевые протоколы и форматы файлов — MAC-адреса, хеш-суммы;
- Символы Unicode — код символа часто записывают в hex (забегая вперёд, подробно про Unicode — в главе про строки).
red = 0xFF
print(red) # 255
Функции bin(), oct(), hex()
Переводят число ИЗ десятичной записи В строку с другой системой счисления:
print(bin(10)) # '0b1010'
print(oct(10)) # '0o12'
print(hex(10)) # '0xa'
int() с указанием основания — обратное преобразование
А функция int() с двумя аргументами делает обратное —
читает текст в указанной системе счисления и возвращает обычное (десятичное) число:
print(int("1010", 2)) # 10
print(int("FF", 16)) # 255
bin() и hex() — а затем переведите результат обратно через int(..., 2) и int(..., 16), чтобы убедиться, что получили то же число.