Системы счисления: понятие, виды, перевод чисел
Число 101 в двоичной системе и число 101 в десятичной - это разные величины. Путаница ровно отсюда: одни и те же цифры означают разное, пока не ясно, в какой системе их записали. В школе и на первом курсе это одна из первых тем, без которой дальше кодирование и память компьютера объясняются через туман.
Система счисления - способ записи чисел с помощью символов (цифр) по заранее заданным правилам. Основание системы показывает, сколько разных цифр в ней используется.
Правила бывают разные. Где-то значение цифры зависит от места в записи (как у нас с «десятками» и «сотнями»). Где-то место почти ни на что не влияет, и число собирают сложением знаков. От этого деления и пляшут классификации.
Позиционные и непозиционные системы
В позиционной системе вес цифры зависит от позиции. В записи 352 цифра 3 означает три сотни, 5 - пять десятков, 2 - две единицы. Сдвинули цифру влево - и вес вырос в основание раз (в десятичной - в 10 раз).
В непозиционной системе место почти не меняет «цену» знака. Классика - римские цифры: I, V, X, L, C, D, M. Число XXX - это три раза по десять. Удобно высекать на камне, неудобно считать столбиком и хранить в памяти машины.
Компьютеры почти везде работают с позиционными системами. Непозиционные встречаются в тексте, истории, иногда в нумерации глав, но не в арифметическом ядре процессора.
Десятичная система счисления
Основание 10. Цифры: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. Мы выросли на ней, поэтому она кажется «естественной». На самом деле естественность тут культурная: десять пальцев, привычка писать счета в магазине.
Любое десятичное число раскладывается по степеням десяти. Для 274:
- 2 · 10² = 200
- 7 · 10¹ = 70
- 4 · 10⁰ = 4
Сложили: 200 + 70 + 4 = 274. Эта же схема работает для любой позиционной системы. Меняется только основание и набор цифр.
Двоичная система счисления
Основание 2. Цифры всего две: 0 и 1. Технически это удобно: сигнал есть / сигнала нет, ток выше порога / ниже порога. Длинный код из нулей и единиц проще надёжно передать, чем короткий код из десятка хитрых уровней сигнала.
Бит - один двоичный разряд, 0 или 1. Байт обычно равен 8 битам. Через байты уже считают объём файлов и размер памяти.
Пример. Число 1101₂ (нижний индекс 2 показывает систему):
- 1 · 2³ = 8
- 1 · 2² = 4
- 0 · 2¹ = 0
- 1 · 2⁰ = 1
Итого 8 + 4 + 0 + 1 = 13₁₀. Если индекс не поставить, 1101 легко принять за «тысячу сто один» в десятичной. В задачах индекс или пометку «₂» почти всегда требуют явно.
Таблица малых степеней двойки стоит держать под рукой: 2⁰=1, 2¹=2, 2²=4, 2³=8, 2⁴=16, 2⁵=32, 2⁶=64, 2⁷=128, 2⁸=256, 2⁹=512, 2¹⁰=1024. С ней перевод «на глаз» идёт быстрее.
Восьмеричная система счисления
Основание 8. Цифры: 0-7. Почему она жива, если процессор «думает» двойкой? Потому что 8 = 2³. Три двоичных разряда аккуратно складываются в одну восьмеричную цифру. Запись короче двоичной, а перевод туда-обратно почти механический.
Пример: 157₈ = 1·8² + 5·8¹ + 7·8⁰ = 64 + 40 + 7 = 111₁₀.
Связка с двоичной: берём 157₈ и каждую цифру пишем тремя битами - 001 101 111, склеиваем: 1101111₂ (ведущие нули слева можно отбросить). Обратно: двоичное число режем справа налево тройками и каждую тройку меняем на цифру 0-7.
Шестнадцатеричная система счисления
Основание 16. Цифр не хватает «обычных», поэтому после 9 идут латинские буквы: A=10, B=11, C=12, D=13, E=14, F=15. В программировании её видно постоянно: цвета в CSS (#FF5733), дампы памяти, адреса, маски.
Почему удобно рядом с двоичной: 16 = 2⁴. Четыре бита = одна hex-цифра. Байт (8 бит) = ровно две hex-цифры. Отсюда привычка писать байт как 0x4F, а не как длинную простыню нулей и единиц.
Пример: 2F₁₆ = 2·16¹ + 15·16⁰ = 32 + 15 = 47₁₀.
Перевод из двоичной в hex: режем биты справа налево по 4. Число 10101101₂ → 1010 1101 → A D → AD₁₆.
Как переводить числа между системами
Два рабочих приёма закрывают почти все школьные и вузовские задания: разложение по степеням (когда цель - десятичная) и деление на основание с остатками (когда цель - другая система из десятичной).
Из любой позиционной в десятичную
Пишем число как сумму «цифра × основание^позиция», считая позиции справа налево с нуля. Уже делали это для 1101₂ и 2F₁₆. Тот же шаблон работает для 345₇ или 1201₅, если вдруг встретится редкое основание.
Ошибка, на которой сыпятся контрольные: забывают, что позиция начинается с нуля справа. Ещё одна - путают буквы hex (E это 14, не «буква в алфавитном номере»).
Из десятичной в другую систему
Делим число на основание нацело, записываем остаток. Частное снова делим. Остатки читаем снизу вверх - это и есть ответ.
Переведём 45₁₀ в двоичную:
- 45 ÷ 2 = 22, остаток 1
- 22 ÷ 2 = 11, остаток 0
- 11 ÷ 2 = 5, остаток 1
- 5 ÷ 2 = 2, остаток 1
- 2 ÷ 2 = 1, остаток 0
- 1 ÷ 2 = 0, остаток 1
Читаем остатки снизу: 101101₂. Проверка обратно: 32+0+8+4+0+1 = 45. Если проверка не сошлась, копайте деление, а не «магию систем».
Тот же алгоритм для восьмеричной и hex: делите на 8 или на 16. Остатки больше 9 в hex записывайте буквами A-F.
Между двоичной, восьмеричной и hex без десятичной
Если обе системы - степени двойки, десятичная как перевалочный пункт не нужна. Группируйте биты:
- в восьмеричную: по 3 бита
- в шестнадцатеричную: по 4 бита
Неполная группа слева дополняется нулями. Справа нули «для красоты» не добавляют: они сдвинут вес разрядов.
Зачем это в информатике
Двоичная система - язык железа. Восьмеричная и hex - человеческий сокращённый слой над ним. Десятичная - язык задач, оценок и привычных величин.
На практике это всплывает в кодировании чисел и текста, в размере памяти, в сетевых масках, в отладке. Даже цвет пикселя #00A8E8 читается проще, чем 24 бита подряд. Подробнее про то, как данные вообще переводят в машинный вид, есть в статье про кодирование информации.
Если в задании просят «перевести и объяснить», хватает схемы: основание, потом разложение или деление, потом проверка обратным ходом. Красивые слова про «важность цифровых технологий» сюда не добавляют ни балла, ни понимания.
Типовая задача с разбором
Условие: переведите 183₁₀ в двоичную, восьмеричную и шестнадцатеричную системы. Покажите проверку.
В двоичную. Делим на 2:
- 183 ÷ 2 → 91, остаток 1
- 91 ÷ 2 → 45, остаток 1
- 45 ÷ 2 → 22, остаток 1
- 22 ÷ 2 → 11, остаток 0
- 11 ÷ 2 → 5, остаток 1
- 5 ÷ 2 → 2, остаток 1
- 2 ÷ 2 → 1, остаток 0
- 1 ÷ 2 → 0, остаток 1
Снизу вверх: 10110111₂. Проверка: 128+0+32+16+0+4+2+1 = 183.
В восьмеричную. Можно заново делить на 8, а можно сгруппировать уже готовые биты по три справа: 10 110 111 → 2 6 7 → 267₈. Быстрее и меньше шансов ошибиться в длинном делении.
В hex. Те же биты по четыре: 1011 0111 → B 7 → B7₁₆. Проверка: 11·16 + 7 = 176 + 7 = 183.
Если три ответа согласованы между собой и с десятичным исходником, задача закрыта. Если двоичная сошлась, а hex «уплыл», почти всегда виновата нарезка групп (забыли ведущий ноль слева или отрезали справа).
Частые ошибки
- Пишут число без указания системы. На бланке это выглядит как будто всё в десятичной.
- Путают направление чтения остатков. Остатки читают снизу вверх, не сверху вниз.
- В hex подставляют порядковый номер буквы в алфавите вместо значения (A это 10, не 1).
- При группировке битов дополняют нулями справа. Нужны слева.
- Считают, что «длинный двоичный код хуже». Для схемы хуже короткий код с кучей уровней напряжения.
Ещё один сюрприз для новичков: в языке Python запись 0b1011, 0o157, 0x2F как раз двоичная, восьмеричная и hex. Это не отдельная «магия языка», а те же системы с префиксами.
Краткая шпаргалка
- Основание = сколько цифр в системе; старшая цифра всегда на 1 меньше основания.
- Позиционная система: место цифры меняет её вес.
- 2, 8, 16 дружат между собой через группы по 1, 3 и 4 бита.
- В десятичную: сумма «цифра × q^k».
- Из десятичной: деление на q, остатки снизу вверх.
- Всегда проверяйте обратным переводом, особенно на контрольной.
Разобрали четыре рабочие системы и два способа перевода. Дальше уже практика: чем больше раз прогоните 30-50 примеров, тем меньше будет «магии» в остатках и степенях.