• Онлайн: 2
Содержание
Смешанные системы счисления
Примеры из жизни
Представьте, что вы считаете яблоки. Вы говорите: «У меня 33 яблока». Все яблоки считаем десятками. Отсчитали первый десяток, сделали перенос, второй десяток - ещё перенос, третий десяток – третий перенос. И ещё три яблока. Итого 3 десятка и три яблока. А если было бы не 33, а 333 яблока, то точно так же десятками считали бы десятки, чтобы получить сотню. Это однородная система, в каждом разряде «максимум» счёта (основание) = 10.
А теперь представьте, что вы считаете время. «Прошло два дня, 5 часов, 10 минут и 35 секунд». У вас тут и дни, и часы, и минуты, и секунды. И у всех разный «максимум» разряда. Это и есть смешанная система счисления. Почему? Потому что в одном разряде у нас «вмещается» одно число, в другом — другое:
- В разряде секунд — максимум 60 (как только набирается 60, они превращаются в 1 минуту).
- В разряде минут — тоже максимум 60 (становятся 1 часом).
- А в разряде часов — максимум 24 (становятся 1 сутками).
Ещё примеры из жизни:
Длина (старая русская система):
- 1 вершок = 4.4 см
- 1 пядь = 4 вершка (уже другой лимит!)
- 1 аршин = 4 пяди
- 1 сажень = 3 аршина
Здесь каждый шаг — разное число (то 4, то 3). Это смесь.
Дюймы и футы (английская система):
- 1 фут = 12 дюймов (лимит 12)
- 1 ярд = 3 фута (лимит 3)
Опять в каждом разряде свой лимит.
Система 2-16
В программировании и электронике часто используется смесь двоичной и шестнадцатеричной систем.
Например, в компьютере всё внутри в двоичном виде (0 и 1). Но человеку читать длиннющую строку 101011110011 неудобно. Поэтому берут и группируют двоичные цифры по 4 штуки (тетрады). А 4 двоичных цифры — это ровно одна шестнадцатеричная цифра (от 0 до F).
То есть мы считаем смешанно:
- Внутри одной шестнадцатеричной цифры — двоичная система (лимит 2).
- А сами цифры идут в 16-ричной системе (лимит 16).
Возьмем для примера число `2027_10`. Переведём его в двоичную систему `11111101011_2` (каким-нибудь способом, например, делением с остатками), а потом запишем как `0111` `1110` `1011_2`. Из такой записи мы сможем его легко «конвертировать» в шестнадцатеричную систему, используя только знания о соответствиях двоичной и шестнадцатеричной записи цифр 0-F. Таким образом у нас получится смешанная система 2-16.
- `2027_10` = `11111101011_2` = `0111` `1110` `1011_(2-16)` = `7EB_16`.
Двоично-десятичный код (Binary-Coded Decimal, BCD)
А теперь давайте рассмотрим смешанную систему 2-10, так называемый двоично-десятичный код. Чтобы записать максимальную в десятичной системе цифру `9_10` нам понадобится 4 двоичных разряда, как и для шестнадцатеричного числа `F_16`. Но лимит разряда у нас теперь будет не 16, а 10, поэтому двоичная запись тетрады сможет достигать не `F_16=1111_2`, а всего лишь `9_10=1001_2`. Если мы просто порежем наше двоичное число, как и раньше, на три тетрады, то получится невозможная запись. 1110 и 1011 не могут существовать в двоично-десятичной системе, т.к. 6 чисел, больших чем 1001, запрещены в такой записи.
Чтобы получить корректную запись числа `2027_10`, нам надо будет каждую его десятичную цифру записать двоичным кодом:
- `2027_10` = `0010` `0000` `0010` `0111_(2-10)` = `10000000100111_(2-10)`.
Попробуем посчитать, сколько будет «похожее» на него `10000000100111_(2-16)`:
- `10000000100111_(2-16)` = `0010` `0000` `0010` `0111_(2-16)` = `2027_16` = `8231_10`.
О как, в 4 раза больше получилось. Потому что `2027_10` совсем не то же самое, что `2027_16`.
Приходим к выводу, что запись одного и того же числа в двоичной системе совпадает с записью в 2-16, а с записью в 2-10 (BCD) не совпадает. Такие пироги. В связи с этим с такими числовыми смешанными системами нужно быть очень аккуратными, особенно если преобразования пытаетесь делать сами на бумажке или в голове. Но за компьютеры и калькуляторы можете не волноваться, они всё корректно посчитают, программисты уже давно всё продумали.
Существует несколько форматов представления BCD:
- Упакованный (Packed BCD) – В одном байте (8 бит) хранятся две десятичные цифры, каждая в своей тетраде. Например, число 1234 в упакованном BCD будет выглядеть как 0001 0010 0011 0100. Этот формат более эффективен по памяти, но требует дополнительной обработки для извлечения отдельных цифр.
- Неупакованный (Unpacked BCD) – Каждая десятичная цифра занимает отдельный байт, причём старшие 4 бита обычно не используются (часто устанавливаются в 0). Например, число 5 в неупакованном BCD — это 0000 0101. Этот формат проще в обработке, но менее эффективен по памяти. Часто используется при посимвольном вводе-выводе.
- Код с избытком 3 (Excess-3) – Перед кодированием к каждой цифре прибавляется 3 (0011 в двоичной системе). Это упрощает реализацию некоторых арифметических операций.
- BCD со знаком – Для представления отрицательных чисел используются разные методы: прямой код (старший бит или тетрада для знака), дополнительный код (дополнение до 10 в соответствующем разряде).
Плюсы BCD:
- Упрощённый ввод-вывод. Не нужно преобразовывать всё число целиком — достаточно вывести каждую тетраду отдельно.
- Точное представление десятичных дробей. Это критично для финансовых расчётов, где ошибки округления недопустимы.
- Упрощённые операции умножения и деления на 10, а также округления.
Минусы BCD:
- Неэффективное использование памяти. На каждую десятичную цифру требуется 4 бита, хотя для её представления достаточно 4 бит, но теряется 6 из 16 возможных комбинаций.
- Усложнённые арифметические операции. При сложении, если сумма в тетраде превышает 9 (или возникает перенос), требуется коррекция (обычно прибавляется 0110).
Двоично-десятичный код широко используется в:
- калькуляторах и измерительных приборах;
- финансовых и бухгалтерских системах;
- часах реального времени и других устройствах, где важна точная десятичная индикация;
- специализированных вычислительных системах.
В обычных вычислительных системах BCD применяется реже из-за указанных выше недостатков, но остаётся важным инструментом в областях, где критична точность десятичных вычислений.
А про то, как я сам того не подозревая, «открыл» для себя двоично-десятичный код, я уже невозбранно рассказывал здесь и здесь.
Суть смешанных систем
Смешанная система – это когда для каждого разряда числа свой «потолок» (основание).
Как будто считаешь яблоки разными «коробками»: в одну коробку влазит 12 яблок, в другую — 30, а в третью — 100. И ты говоришь: «У меня 2 коробки по 12, 3 коробки по 30 и 1 коробка по 100». Это и есть запись числа в смешанной системе.
