Системы счисления: двоичная, восьмеричная, шестнадцатеричная
Позиционные системы счисления, конвертация между ними, использование в программировании.
Введение
Системы счисления — это фундамент, на котором построена вся цифровая техника и программирование. Каждый раз, когда вы открываете сайт, нажимаете кнопку или сохраняете файл, внутри процессора происходят операции с числами, представленными в особой форме. Понимание того, как устроены позиционные системы счисления, позволяет программисту эффективнее работать с памятью, битовыми масками, цветовыми кодами и сетевыми адресами.
В этой статье мы подробно разберём четыре основные системы счисления, которые применяются в IT: десятичную, двоичную, восьмеричную и шестнадцатеричную. Вы научитесь переводить числа между ними, поймёте, почему программисты выбрали именно эти системы, и научитесь читать «страшные» значения вроде 0xDEADBEEF или 0o755 без словаря.
Что такое система счисления
Система счисления — это способ записи чисел с помощью определённого набора знаков (цифр) по заданным правилам. Различают два больших класса: позиционные и непозиционные системы. В непозиционной системе значение цифры не зависит от её позиции в числе — классический пример римская нумерация, где символ X всегда означает десять независимо от места.
В позиционной системе значение цифры определяется её позицией (разрядом). Основание системы показывает, сколько различных цифр доступно и во сколько увеличивается вес разряда при сдвиге влево. Так, в привычной нам десятичной системе основание равно 10, а каждый следующий разряд весит в 10 раз больше предыдущего.
Основные характеристики позиционных систем
| Система | Основание | Цифры | Типичное применение |
|---|---|---|---|
| Десятичная | 10 | 0–9 | Повседневные вычисления |
| Двоичная | 2 | 0, 1 | Аппаратное обеспечение, процессоры |
| Восьмеричная | 8 | 0–7 | Права доступа в Unix,legacy-системы |
| Шестнадцатеричная | 16 | 0–9, A–F | Цвета, адреса памяти, байтовые дампы |
Двоичная система счисления
Двоичная (бинарная) система использует всего две цифры — 0 и 1. Каждый разряд называется битом, а группа из восьми битов — байтом. Выбор именно этой системы для цифровой электроники не случаен: две цифры идеально соответствуют двум устойчивым состояниям электронного элемента (есть напряжение / нет напряжения, намагничено / не намагничено).
Любое целое число можно представить в двоичном виде. Например, десятичное 42 в двоичной системе записывается как 101010:
1·2⁵ + 0·2⁴ + 1·2³ + 0·2² + 1·2¹ + 0·2⁰
= 32 + 0 + 8 + 0 + 2 + 0
= 42Двоичная запись компактнее для компьютера, но очень неудобна для человека: даже небольшое значение превращается в длинную цепочку нулей и единиц. Именно поэтому программисты используют «сжатые» варианты — восьмеричную и шестнадцатеричную системы.
Восьмеричная система счисления
Восьмеричная система имеет основание 8 и использует цифры от 0 до 7. Главное достоинство системы — простая связь с двоичной: одна восьмеричная цифра соответствует ровно трём двоичным битам (поскольку 8 = 2³). Это делает перевод между системами практически мгновенным.
Восьмеричная система широко применялась в ранних компьютерах, где машинное слово делилось на группы по 3 бита. Сегодня её основной остаток — запись прав доступа к файлам в Unix-подобных системах. Командаchmod 755 file устанавливает права, где каждая цифра описывает уровень доступа:
7 = rwx (чтение + запись + исполнение)
5 = r-x (чтение + исполнение)
5 = r-x (чтение + исполнение)
Владелец: 7 Группа: 5 Остальные: 5Шестнадцатеричная система счисления
Шестнадцатеричная система (hex) использует 16 знаков: цифры 0–9 и буквыA–F (или a–f) для значений 10–15. Одна hex-цифра соответствует четырём битам (16 = 2⁴), то есть половине байта — так называемой «тетраде» или «нибблу».
Шестнадцатеричная запись — стандарт де-факто для представления байтовых данных. Цвета в CSS задаются в формате #RRGGBB, MAC-адреса сетевых карт записываются через двоеточие, а отладчики памяти показывают содержимое в виде hex-дампов.
| Десятичная | Двоичная | Восьмеричная | Шестнадцатеричная |
|---|---|---|---|
| 0 | 0000 | 0 | 0 |
| 7 | 0111 | 7 | 7 |
| 10 | 1010 | 12 | A |
| 15 | 1111 | 17 | F |
| 16 | 10000 | 20 | 10 |
| 255 | 11111111 | 377 | FF |
| 1024 | 10000000000 | 2000 | 400 |
Перевод между системами счисления
Существует несколько универсальных методов перевода. Самый простой и наглядный — перевод через десятичную систему как промежуточное звено. Алгоритм перевода числа из системы с основанием N в десятичную состоит в разложении числа по степеням основания.
Пример: шестнадцатеричное 2AF в десятичное
2AF₁₆ = 2·16² + A·16¹ + F·16⁰
= 2·256 + 10·16 + 15·1
= 512 + 160 + 15
= 687₁₀Обратный перевод (из десятичной в произвольную) выполняется методом последовательного деления на основание: остатки от деления, прочитанные снизу вверх, и дают искомое число. Для перевода между двоичной, восьмеричной и шестнадцатеричной системой можно использовать более быстрый «групповой» метод.
Быстрый перевод через группы битов
Двоичное: 1101 0111 1010 0011
Группы по 4 бита → hex: D 7 A 3 = 0xD7A3
Группы по 3 бита → oct: 1 101 011 110 100 011
1 5 3 6 4 3 = 0o153643Этот приём работает мгновенно, потому что основания 8 и 16 являются степенями двойки. Для практики попробуйте бесплатный конвертер из десятичной в шестнадцатеричную, чтобы быстро проверять свои вычисления.
Системы счисления в программировании
Современные языки программирования поддерживают литералы в нескольких системах счисления. В JavaScript, TypeScript, Python, C и многих других языках используются следующие префиксы:
// JavaScript / TypeScript
0b1010 // двоичная, равно 10
0o755 // восьмеричная, равно 493
255 // десятичная
0xFF // шестнадцатеричная, равно 255
// Преобразование в строку
(255).toString(2) // "11111111"
(255).toString(16) // "ff"
(255).toString(8) // "377"Знание систем счисления пригождается при работе с цветовыми моделями: например, RGB-цветrgb(13, 110, 253) записывается в CSS как #0d6efd, где каждая пара hex-цифр кодирует один из каналов. Побитовые операции (&, |, ^, <<, >>) также требуют уверенного владения двоичным представлением чисел.
Типичные ошибки при работе с системами счисления
- Использование недопустимых цифр — например, запись
08или09в восьмеричной системе. - Путаница между префиксами
0,0xи0bв разных языках. - Забывание про старший бит знака при работе с отрицательными числами в дополнительном коде.
- Игнорирование порядка байтов (endianness) при чтении hex-дампов сетевых пакетов.
Арифметика в различных системах счисления
Арифметические операции в любой позиционной системе выполняются по тем же правилам, что и в десятичной: сложение столбиком, умножение с переносом, деление «уголком». Разница лишь в том, что перенос возникает при достижении основания системы, а не десятки. Например, в двоичной системе 1 + 1 = 10(единица переходит в старший разряд), в восьмеричной 7 + 1 = 10, а в шестнадцатеричнойF + 1 = 10.
Сложение в двоичной:
10110
+ 11011
-------
110001
(по разрядам: 0+1=1, 1+1=10, 1+0+1=10, 0+1+1=10, 1+1+1=11)
Сложение в шестнадцатеричной:
3F
+ 27
---
66
(F + 7 = 16 = 10₁₆ → 0, перенос 1; 3 + 2 + 1 = 6)На практике арифметику вручную почти не выполняют — для этого есть калькуляторы и функции языка. Однако понимание принципов помогает предсказать результаты побитовых операций, оценивать переполнения и понимать, почему число «не помещается» в выбранный тип данных.
История систем счисления
Десятичная система стала общепринятой не из-за математического совершенства, а благодаря тому, что у человека десять пальцев на руках — это естественный «счётный инструмент». Древние цивилизации использовали и другие основания: шумеры и вавилоняне — шестидесятеричную систему (отголоски которой сохранились в делении часа на 60 минут и градуса на 60 минут), майя — двадцатеричную.
Двоичная система была впервые описана Готфридом Лейбницем в 1703 году в работе «Explication de l'Arithmétique Binaire». Лейбниц увидел в ней философский смысл — единицу как бытие и ноль как ничто. Однако практическое применение двоичная система нашла лишь в XX веке, когда Клод Шеннон показал, что булева алгебра идеально подходит для проектирования электрических схем. С тех пор двоичная система стала основой всей цифровой техники.
Заключение
Системы счисления — это не абстрактная математика, а рабочий инструмент любого разработчика, системного администратора и специалиста по кибербезопасности. Двоичная система показывает, как устроена «начинка» компьютера, восьмеричная помогает читать права доступа, а шестнадцатеричная делает удобной работу с байтами, цветами и адресами.
Чтобы закрепить материал на практике, попробуйте перевести число из десятичной в двоичную или обратно, а затем сверьте результат с нашими конвертерами. Регулярная практика помогает быстро развить интуицию и читать числа в любой системе счисления так же свободно, как и привычные десятичные значения.
Попробуйте эти инструменты
Похожие статьи
Двоичная в десятичную: как конвертировать
Алгоритм перевода binary to decimal, степени двойки, примеры, использование в программировании.
Римские цифры: таблица и правила записи
Римская система счисления, символы, правила, запись больших чисел, история и современное использование.
Калькулятор процентов: как считать проценты
Виды расчёта процентов: от числа, процентное изменение, скидки, налоги, примеры.
URL parser: разбор адресов веб-страниц
Структура URL: protocol, host, path, query, fragment. Как парсить URL в JavaScript.