Путешествие по математической летописи человечества.
В работе специалистов по кибербезопасности часто встречаются разные системы счисления. Например, при анализе логов они сталкиваются с IP-адресами в различных форматах. Тот же IP-адрес 192.168.1.1 можно встретить в двоичном виде как 11000000.10101000.00000001.00000001, а в шестнадцатеричном — как C0.A8.01.01. Понимание этих форматов помогает анализировать сетевой трафик и находить потенциальные угрозы.
Но что такое система счисления? В этой статье мы заглянем в историю их развития и разберёмся, как переводить числа между разными системами.
Основные системы счисления
Система счисления — это математический язык, в котором вы можете использовать символы для записи чисел по определённым правилам.
На протяжении истории человечества люди разработали множество способов записи чисел, но сегодня принято выделять два основных типа:
- Непозиционные системы — древнейшие системы счисления, в которых значение символа остаётся неизменным вне зависимости от его места в числе. Например, в римской системе символ X всегда обозначает 10, независимо от того, стоит ли он в начале (XVI = 16) или в конце (LX = 60).
- Позиционные системы — системы счисления, где значение цифры определяется её положением в числе. Например, в числе 333 у каждой тройки разное значение: первая означает 300, вторая — 30, а третья — 3.
Каждая система счисления имеет свою область применения. Позиционные системы подходят для вычислений — сложить числа 23 и 45 проще, чем XXIII и XLV в римской системе. Непозиционные системы используются реже — например, в нумерации глав книг (I, II, III) или обозначении веков (XX век).
В следующих разделах мы рассмотрим обе системы счисления. Начнём с непозиционных систем и выясним, почему они уступили место позиционным. После изучим позиционные системы — познакомимся с их видами и научимся конвертировать числа между разными форматами.
Непозиционные системы счисления
Непозиционные системы счисления сформировались естественным образом с развитием человечества. Вот основные предпосылки их появления:
- Древним цивилизациям требовался надёжный способ учёта товаров, землемерия, строительства и астрономических наблюдений.
- Развитие письменности позволило записывать числовые значения.
- Использование отдельных символов для записи чисел оказалось интуитивно понятным способом счёта.
К наиболее известным непозиционным системам счисления относятся единичная, древнеегипетская, римская, греческая и славянская. Далее мы рассмотрим особенности и историческую значимость каждой из них.
Единичная система счисления
Единичная система счисления — это простейший способ записи чисел, в котором количество обозначается повторением одного и того же символа столько раз, сколько единиц содержится в числе. Она возникла естественным путём из процесса подсчёта предметов в период, когда более сложные математические концепции ещё не существовали.
Люди изображали предметы счёта в виде разных символов: палочек, камешков, узелков — всего, что было под рукой. Применялась система в разных сферах: от древних способов подсчёта дней с помощью зарубок на дереве или камне до современного использования в простых играх для ведения счёта. Записать число в этой системе очень просто — например, число 5 записывается как пять палочек (|||||), а число 3 — как три палочки (|||).
Единичная система хорошо подходила для простейших арифметических действий — сложения и вычитания. Однако при работе с большими числами возникал риск ошибок как в записи, так и в подсчёте. Например, запись числа 100 потребовала бы изображения ста отдельных палочек. Именно поэтому в ходе развития цивилизации люди перешли к группировке символов, что привело к появлению более эффективных систем счисления.
Запись чисел от 1 до 5 в единичной системе счисления
Изображение: Benjamin D. Esham / Wikimedia Commons
Древнеегипетская десятичная система
Древнеегипетская десятичная система — это система счисления с основанием 10. Она была неотъемлемой частью жизни древних египтян и применялась в торговле, строительстве пирамид, земледелии и астрономии. Для записи чисел использовались особые символы: палочка (1), арка (10), моток верёвки (100), водяная лилия (1000), согнутый палец (10000), лягушка или головастик (100000) и человек с поднятыми руками (1000000).
Древние египтяне не придавали особого значения направлению записи чисел — они могли писать их слева направо, справа налево или сверху вниз. Учёные обнаружили у них особый знак, который выполнял функции нуля — изображался в виде сердца с трахеей. В бухгалтерских папирусах этот знак указывал на полный расход средств, а в чертежах обозначал уровень земли.
Египтяне также использовали дроби в своих вычислениях. Они записывали их похожим на современный способом — размещали над числом специальный иероглиф в форме рта, который обозначал часть целого.
Фрагмент древнеегипетской надписи: запись числа 35 736, примерно II тысячелетие до н. э.
Изображение: Public Domain / Wikimedia Commons
Римская система счисления
Римская система счисления — это система записи чисел с помощью букв латинского алфавита. В её основе лежит принцип сложения и вычитания значений символов, где каждая буква обозначает определённое число. Основные символы: I (1), V (5), X (10), L (50), C (100), D (500) и M (1000).
Каждое число — это последовательность символов, записанная по определённым правилам. Значение такого числа складывается из значений всех его символов. Например, число 32 записывается как XXXII (30 + 2 = 32).
Если слева от большего символа стоит меньший, то его значение вычитается из большего. Например, число 48 записывается как XLVIII: из 50 (L) вычитается 10 (X), после чего прибавляется 5 (V) и 3 (III). Важно отметить, что слева от большего символа может стоять только один меньший символ — запись XXL недопустима и не может обозначать число 30.
В современном мире римские цифры используются для обозначения веков, глав в книгах, часов на циферблатах, а также порядковых номеров правителей и мероприятий — XXI век, глава IV, Карл V, том III, Пётр I.
Римские цифры на борту судна Катти Сарк — старинного парусника в музее Гринвича. Цифры обозначают маркировку ватерлинии — отметки на корпусе корабля, показывающие глубину погружения в воду
Фото: Alex1011 / Wikimedia Commons
Греческая и славянская системы счисления
Греческая и славянская системы счисления — алфавитные системы записи чисел, где числовые значения передаются буквами. Греческая система использовала греческий алфавит, а славянская — кириллицу. Обе системы применялись в религиозных текстах, летописях и деловых документах.
В греческой системе буква «альфа» означала 1, «бета» — 2, «йота» — 10, а в славянской системе буква «аз» означала 1, «веди» — 2, «и десятеричное» — 10. Для обозначения тысяч применялся специальный знак, а числовое значение буквы выделялось титлом (надстрочным знаком).
Числа записывались слева направо по убыванию — от большего к меньшему. Особый случай представляли числа от 11 до 19: в них единицы записывались перед десятками. Этот принцип можно увидеть и в современном языке при сравнении чисел разного порядка. Например, когда мы говорим «шестьдесят один», сначала называем десятки («шестьдесят»), потом единицы («один»). А в числе «шестнадцать» порядок обратный — сначала называем единицы («шесть»), затем числительное «надцать», обозначающее прибавление к десяти.
Главными достоинствами этих систем были их органичное слияние с письменностью и доступность для образованных людей того времени.
Знаки чисел в кириллической системе счисления
Изображение: Tcr25 / Wikimedia Commons
Позиционные системы счисления
Несмотря на свою историческую значимость, непозиционные системы счисления имеют существенные недостатки, которые привели к их замене позиционными системами в большинстве сфер применения:
- Сложность арифметических действий — например, в римской системе умножение и деление требуют сложных поэтапных вычислений.
- Отсутствие универсальности — каждая система требует уникального набора символов, что затрудняет международное взаимодействие.
- Громоздкость — большие числа требуют чрезмерно много символов.
Позиционные системы, напротив, очень удобны: в них не возникает разночтений при записи чисел, а количество разрядов не имеет ограничений — можно записать любое число, каким бы большим оно ни было.
Все позиционные системы делятся на две основные категории: однородные и неоднородные (смешанные). Рассмотрим особенности каждой из них.
Однородные позиционные системы счисления
Однородная система счисления — это позиционная система, в которой применяется единое основание для всех разрядов числа. Значение числа в такой системе определяется как цифрами, так и их позицией. Каждая позиция в числе имеет свой «вес» — это основание системы, возведённое в степень, равную номеру позиции. Чтобы получить значение числа, нужно умножить каждую цифру на «вес» её позиции и сложить результаты.
Наиболее распространенными позиционными системами счисления являются двоичная, восьмеричная, десятичная и шестнадцатеричная.
Двоичная система счисления
Это способ представления чисел с помощью всего двух символов: 0 и 1. В этой системе каждая позиция числа представляет степень двойки, начиная с нулевой степени справа налево. Например, число 42 в двоичной системе записывается как 101010, где каждая позиция соответствует степени двойки (32 + 0 + 8 + 0 + 2 + 0 = 42).
Данная система получила широкое применение в вычислительной технике:
- Простота реализации — электронные схемы эффективно работают с двумя состояниями: наличием либо отсутствием электрического тока.
- Надёжность — использование всего двух состояний значительно уменьшает вероятность ошибок при передаче и обработке сигналов.
- Экономичность — обработка двоичных данных требует минимума компонентов: транзисторов, резисторов, конденсаторов и микросхем.
Восьмеричная система счисления
Это способ записи чисел с использованием восьми цифр (от 0 до 7). В этой системе значение каждого разряда определяется умножением на соответствующую степень числа 8. Например, 147₈ в восьмеричной системе можно разложить так: 1 × 8² + 4 × 8¹ + 7 × 8⁰ = 64 + 32 + 7 = 103 в десятичной системе.
Восьмеричная система была создана для упрощения работы с двоичными числами благодаря более компактной записи. Это было важно на раннем этапе развития компьютерной техники, когда память была ограничена. Так, восьмеричное число 7₈ соответствует двоичному 111₂, а 6₈ — числу 110₂.
В современных компьютерных системах восьмеричная система счисления применяется, но уступает место шестнадцатеричной. Шестнадцатеричная система эффективнее для записи байтов — один байт данных можно представить всего двумя шестнадцатеричными знаками. Это делает её особенно удобной для низкоуровневого программирования и отладки.
Десятичная система счисления
Это способ записи чисел с помощью десяти цифр (от 0 до 9), в котором каждая позиция числа представляет определённую степень десятки. Число 567 можно разложить 5 × 10² + 6 × 10¹ + 7 × 10⁰, или записать проще — 500 + 60 + 7.
Появление десятичной системы связано с естественным фактором — десятью пальцами рук человека, которые издревле служили для счёта. Система широко распространилась в Индии в V–VI веках нашей эры, откуда через арабских математиков пришла в Европу. Арабские цифры заменили римские, что значительно упростило сложные математические вычисления и заложило фундамент современной десятичной системы.
В нашей повседневной жизни десятичная система применяется повсеместно — в торговле, банковском деле, науке и технике. В денежных расчётах мы используем рубли и копейки (1 рубль = 100 копеек), а при измерении температуры — градусы Цельсия с десятыми долями (например, 36,6 °C). А ещё для записи дробных чисел у нас есть десятичная точка или запятая, которые позволяют выражать числа с любой необходимой точностью.
Самая ранняя десятичная таблица умножения из бамбуковых пластинок датируется 305 годом до н. э. — периодом Сражающихся царств в Китае
Фото: Research and Conservation Center for Excavated Texts / Tsinghua University / Wikimedia Commons
Шестнадцатеричная система счисления
Это способ записи чисел с использованием 16 символов. Она включает цифры от 0 до 9 и шесть букв латинского алфавита (A, B, C, D, E, F), которые обозначают числа от 10 до 15. Эта система была создана специально для работы с компьютерными данными, так как позволяет компактно представлять двоичные числа.
Сегодня шестнадцатеричная система применяется в различных областях:
- В веб-разработке — для обозначения цветов в CSS. Например, код #FF5733 обозначает оранжевый цвет.
- В криптографии — для представления хеш-значений. Так, код 8A4B2C1D служит для проверки целостности данных.
- В сетевых технологиях — для записи IP-адресов. Например, адрес 2001:0db8:85a3 используется в протоколе IPv6.
- В игровой индустрии — для отладки программ и тестирования игр, например, код 0xDEADBEEF указывает на сбой программного обеспечения.
- В системном программировании — для обозначения ошибок и состояний системы, где код 0×0000FFFF указывает на тип сбоя.
Смешанные системы счисления
Рассмотрим смешанную систему, где каждый разряд имеет своё собственное основание: первый разряд — 2, второй — 3, третий — 4 (записывается как [2, 3, 4]). В такой системе число 123 раскладывается следующим образом:
- Первая цифра (1) умножается на произведение всех младших оснований:
1 × (3 × 4) = 12. - Вторая цифра (2) умножается на основание младшего разряда: 2 × 4 = 8.
- Третья цифра (3) умножается на 1: 3 × 1 = 3.
- Сумма всех значений (12 + 8 + 3) даёт число 23 в десятичной системе.
Вавилонская шестидесятеричная система считается одной из древнейших смешанных систем. В ней используются символы от 0 до 59, а каждый разряд представляет собой степень числа 60. Значение символа зависит от его позиции, при этом каждый следующий разряд увеличивает число в 60 раз.
Вавилонская система использовала два основных символа: вертикальный клин для обозначения единиц и горизонтальный клин для десятков. Числа записывались справа налево, а новый разряд начинался после определённой комбинации этих символов. Вертикальный клин имел двойное значение — обозначал как единицу, так и число 60 с его степенями, откуда и пошло название «шестидесятеричная система». Позиционный характер системы проявлялся в том, что при записи чисел больше 60 значение символа (1 или 60) определялось его положением в числе.
С развитием торговли и астрономии вавилоняне начали записывать не только целые числа, но и дроби. Для этого они усовершенствовали систему и добавили дополнительные разряды после целой части числа. Так появилась смешанная форма записи: целая часть записывалась в шестидесятеричной системе, а каждый разряд дробной части представлял деление на 60.
Вавилонская система оказалась настолько эффективной, что стала основой множества современных измерительных приборов — от наручных часов до высокоточных навигационных систем GPS. Рассмотрим современные часы с точным временем. Например, 10:45:30. В этом формате каждый компонент использует свою систему счисления: часы отображаются в 12- или 24-часовом формате, а минуты и секунды — в 60-ричной системе (от 0 до 59).
Таблица вавилонских числовых знаков
Изображение: Josell7 / Wikimedia Commons
Перевод из одной системы в другую
Разработчики приходится регулярно сталкиваться с разными системами счисления. Вот несколько ситуаций, где нужно выполнять преобразования:
- При работе с битовыми операциями и масками для оптимизации кода и улучшения производительности программ. Например, число 1111 в двоичной системе (0b1111) соответствует F в шестнадцатеричной (0xF).
- При анализе и отладке программ для эффективного управления памятью и поиска ошибок. Пример: адрес в памяти 4095 в десятичной системе соответствует 0xFFF в шестнадцатеричной.
- При настройке сетевого оборудования для конфигурации и диагностики устройств. Например, IP-адрес 127.0.0.1 в десятичной записи соответствует 7F.00.00.01 в шестнадцатеричной.
- В криптографии и защите информации для обработки и верификации зашифрованных данных. К примеру, ключ шифрования может быть представлен как в двоичном, так и в шестнадцатеричном виде.
- При работе с цветовыми кодами в веб-разработке и графическом дизайне. Так, чистый синий цвет RGB (0, 0, 255) в десятичной системе записывается как #0000FF в шестнадцатеричной.
Для перевода чисел между система есть три основных метода: деление с остатком, умножение с накоплением и использование таблиц соответствия.
- 83 ÷ 2 = 41 (остаток 1);
- 41 ÷ 2 = 20 (остаток 1);
- 20 ÷ 2 = 10 (остаток 0);
- 10 ÷ 2 = 5 (остаток 0);
- 5 ÷ 2 = 2 (остаток 1);
- 2 ÷ 2 = 1 (остаток 0);
- 1 ÷ 2 = 0 (остаток 1);
- Результат: 83₁₀ = 1010011₂.
Переведём 101₂ в десятичную систему:
- Первая цифра справа (1): 1 × 2⁰ = 1.
- Средняя цифра (0): 0 × 2¹ = 0.
- Последняя цифра (1): 1 × 2² = 4.
- Складываем: 4 + 0 + 1 = 5₁₀.
В дополнение к описанным методам можно использовать возможности современных языков программирования, так как многие из них имеют встроенные функции для конвертации между системами счисления.
Например, вот некоторые методы языка JavaScript:
// Пример перевода десятичного числа в двоичную систему let dec = 42; console.log(dec.toString(2)); // Результат: 101010 // Перевод двоичного числа в десятичную систему let bin = “1100”; console.log(parseInt(bin, 2)); // Результат: 12 // Перевод из шестнадцатеричной системы в двоичную let hex = “2F”; console.log(parseInt(hex, 16).toString(2)); // Результат: 101111 // Перевод из восьмеричной системы в двоичную let oct = “52”; console.log(parseInt(oct, 8).toString(2)); // Результат: 101010
Информацию по работе с системами счисления можно найти в официальной документации. Подробные руководства доступны для Python, JavaScript, Java, C++, Ruby, PHP, Go и других языков программирования.