bitGateLab Digital · Обучение
Русский
Открыть симулятор

Обучение › Тема 6

Системы счисления: двоичная, восьмеричная, шестнадцатеричная и коды

7 мин чтения · Команда bitGateLab

Цифровая схема понимает только нули и единицы, а вам нужно представлять количества, знаки, цифры на индикаторе и положения энкодера. Здесь вы узнаете, как устроены позиционные системы счисления, научитесь переводить числа между десятичной, двоичной, восьмеричной и шестнадцатеричной системами, представлять отрицательные числа в дополнительном коде и пользоваться двумя очень распространёнными в электронике кодами: BCD и кодом Грея.

Позиционные системы счисления

В позиционной системе с основанием b каждая цифра умножается на степень b, соответствующую её позиции, считая от 0 справа. Десятичное число 347 равно 3·102 + 4·101 + 7·100. Так же устроены и другие системы:

Чтобы не возникало путаницы, основание указывают нижним индексом (10102, 178, 3F16) или префиксом вроде 0b или 0x.

Перевод из одной системы в другую

Из любой системы в десятичную

Умножьте каждую цифру на её вес и сложите. Например, 2F316 = 2·256 + 15·16 + 3·1 = 512 + 240 + 3 = 755.

Из десятичной в двоичную

Делите число на 2 раз за разом и записывайте остатки; двоичное число читается снизу вверх (последний остаток — старший бит). Другой способ — снова и снова вычитать наибольшую степень числа 2, которая помещается в остаток.

Между двоичной, восьмеричной и шестнадцатеричной

Поскольку 8 = 23 и 16 = 24, переходить через десятичную систему не нужно: сгруппируйте биты по 3 (восьмеричная) или по 4 (шестнадцатеричная), начиная справа, и при необходимости дополните слева нулями.

Пример 1: перевести 156 в двоичную, восьмеричную и шестнадцатеричную системы.

  1. Последовательное деление: 156/2 = 78, ост. 0; 78/2 = 39, ост. 0; 39/2 = 19, ост. 1; 19/2 = 9, ост. 1; 9/2 = 4, ост. 1; 4/2 = 2, ост. 0; 2/2 = 1, ост. 0; 1/2 = 0, ост. 1.
  2. Читаем остатки снизу вверх: 156 = 100111002. Проверка: 128 + 16 + 8 + 4 = 156.
  3. Восьмеричная: 10 011 100 → 010 011 100 → 2 3 4. Результат 2348 (2·64 + 3·8 + 4 = 156).
  4. Шестнадцатеричная: 1001 1100 → 9 C. Результат 9C16 (9·16 + 12 = 156).

Отрицательные числа: дополнительный код

В регистре из n бит нет места для знака «минус», поэтому пользуются соглашением. Практически во всех процессорах принят дополнительный код (дополнение до 2): старший бит имеет отрицательный вес, −2n−1, а остальные сохраняют свой положительный вес. При 8 битах диапазон составляет от −128 до +127; при 4 битах — от −8 до +7.

Чтобы получить число с противоположным знаком:

  1. Запишите положительное число со всеми его битами.
  2. Инвертируйте каждый бит (это обратный код, или дополнение до 1).
  3. Прибавьте 1.

Выигрыш огромен: сложение и вычитание выполняются одной и той же схемой сумматора, без особой логики для знака. Ноль только один (00000000), а старший бит прямо показывает, отрицательно ли число.

Пример 2: представить −45 в 8 битах и вычислить 25 + (−12).

  1. 45 = 00101101. После инверсии: 11010010. После прибавления 1: 11010011 = −45.
  2. Проверка по весам: −128 + 64 + 16 + 2 + 1 = −45.
  3. Теперь 25 + (−12). 25 = 00011001; 12 = 00001100, после инверсии 11110011, плюс 1: 11110100 = −12.
  4. Сумма: 00011001 + 11110100 = 1 00001101. Перенос, выходящий из бита 8, отбрасывается.
  5. Результат: 00001101 = 13. Верно.
Переполнение: если вы складываете два числа одного знака, а результат получается противоположного знака, значит, он не помещается в имеющиеся биты. Например, в 8 битах 100 + 50 = 01100100 + 00110010 = 10010110, что в дополнительном коде равно −106, а не 150. При сложении чисел разных знаков переполнения не бывает никогда.

Код BCD

В коде BCD (двоично-десятичный код, вариант 8421) каждая десятичная цифра представляется отдельно, 4 битами. Так, 395 записывается как 0011 1001 0101. Это не то же самое, что перевести 395 в двоичную систему (1100010112): BCD занимает больше бит, зато каждую группу можно без всяких делений подать прямо на дешифратор 7-сегментного индикатора. Коды от 1010 до 1111 в BCD недопустимы; при проектировании такие комбинации обычно считают безразличными условиями в картах Карно.

Код Грея

В коде Грея при переходе от одного значения к следующему меняется только один бит. В обычном двоичном коде при переходе от 7 (0111) к 8 (1000) меняются сразу все четыре бита; если датчик считывает значение как раз в момент перехода, он может на мгновение увидеть любое промежуточное значение. С кодом Грея такой ошибки не бывает, поэтому его применяют в энкодерах положения, в счётчиках, значения которых передаются из одного тактового домена в другой, и в заголовках карт Карно.

ДесятичноеДвоичноеКод ГреяДесятичноеДвоичноеКод Грея
000000000810001100
100010001910011101
2001000111010101111
3001100101110111110
4010001101211001010
5010101111311011011
6011001011411101001
7011101001511111000

Пример 3: двоичное 1011 в код Грея и обратно.

  1. Скопируйте первый бит: 1.
  2. 1 ⊕ 0 = 1; 0 ⊕ 1 = 1; 1 ⊕ 1 = 0. Код Грея = 1110.
  3. Обратно: скопируйте первый бит, b3 = 1. Затем b2 = 1 ⊕ 1 = 0, b1 = 0 ⊕ 1 = 1, b0 = 1 ⊕ 0 = 1. Двоичное = 1011.

В таблице десятичному числу 11 соответствует код Грея 1110: совпадает.

Типичные ошибки

Попробуйте в симуляторе

Эти представления можно увидеть «вживую» с помощью нескольких входов и выходов, а перевод в код Грея — проверить на элементах XOR.

  1. Поместите четыре входа в качестве битов от b3 до b0 и подключите индикатор или четыре светодиода, чтобы видеть значение.
  2. Добавьте три элемента XOR: g2 = b3 ⊕ b2, g1 = b2 ⊕ b1, g0 = b1 ⊕ b0, а b3 соедините напрямую с g3.
  3. Меняйте входы от 0000 до 1111 и наблюдайте по выходам, что при переходе от одного значения к следующему меняется только один бит кода Грея.
  4. Постройте таблицу истинности схемы и сравните её с таблицей из этой статьи.

Упражнения

  1. Переведите 110101102 в шестнадцатеричную и в десятичную системы.
    Ответ

    1101 0110 = D616 = 13·16 + 6 = 214.

  2. Переведите 200 в двоичную и в шестнадцатеричную системы.
    Ответ

    200 = 128 + 64 + 8 = 110010002 = C816.

  3. Представьте −100 в дополнительном коде в 8 битах.
    Ответ

    100 = 01100100; после инверсии 10011011; плюс 1: 10011100. Проверка: −128 + 16 + 8 + 4 = −100.

  4. Переведите десятичное число 6 в 4-битный код Грея, а BCD-код 0111 0010 — в десятичное число.
    Ответ

    6 = 0110; код Грея: 0, 0 ⊕ 1 = 1, 1 ⊕ 1 = 0, 1 ⊕ 0 = 1 → 0101. BCD-код 0111 0010 — это 72.

Чтобы увидеть, как схема складывает и вычитает такие числа, переходите к теме «двоичные сумматоры».