Обучение › Тема 6
Системы счисления: двоичная, восьмеричная, шестнадцатеричная и коды
7 мин чтения · Команда bitGateLab
Цифровая схема понимает только нули и единицы, а вам нужно представлять количества, знаки, цифры на индикаторе и положения энкодера. Здесь вы узнаете, как устроены позиционные системы счисления, научитесь переводить числа между десятичной, двоичной, восьмеричной и шестнадцатеричной системами, представлять отрицательные числа в дополнительном коде и пользоваться двумя очень распространёнными в электронике кодами: BCD и кодом Грея.
Позиционные системы счисления
В позиционной системе с основанием b каждая цифра умножается на степень b, соответствующую её позиции, считая от 0 справа. Десятичное число 347 равно 3·102 + 4·101 + 7·100. Так же устроены и другие системы:
- Двоичная (основание 2): цифры 0 и 1, называемые битами. Веса разрядов: 1, 2, 4, 8, 16, 32, 64, 128...
- Восьмеричная (основание 8): цифры от 0 до 7. Каждая восьмеричная цифра соответствует 3 битам.
- Шестнадцатеричная (основание 16): цифры от 0 до 9 и от A до F (A = 10, B = 11, C = 12, D = 13, E = 14, F = 15). Каждая шестнадцатеричная цифра соответствует 4 битам.
Чтобы не возникало путаницы, основание указывают нижним индексом (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 в двоичную, восьмеричную и шестнадцатеричную системы.
- Последовательное деление: 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.
- Читаем остатки снизу вверх: 156 = 100111002. Проверка: 128 + 16 + 8 + 4 = 156.
- Восьмеричная: 10 011 100 → 010 011 100 → 2 3 4. Результат 2348 (2·64 + 3·8 + 4 = 156).
- Шестнадцатеричная: 1001 1100 → 9 C. Результат 9C16 (9·16 + 12 = 156).
Отрицательные числа: дополнительный код
В регистре из n бит нет места для знака «минус», поэтому пользуются соглашением. Практически во всех процессорах принят дополнительный код (дополнение до 2): старший бит имеет отрицательный вес, −2n−1, а остальные сохраняют свой положительный вес. При 8 битах диапазон составляет от −128 до +127; при 4 битах — от −8 до +7.
Чтобы получить число с противоположным знаком:
- Запишите положительное число со всеми его битами.
- Инвертируйте каждый бит (это обратный код, или дополнение до 1).
- Прибавьте 1.
Выигрыш огромен: сложение и вычитание выполняются одной и той же схемой сумматора, без особой логики для знака. Ноль только один (00000000), а старший бит прямо показывает, отрицательно ли число.
Пример 2: представить −45 в 8 битах и вычислить 25 + (−12).
- 45 = 00101101. После инверсии: 11010010. После прибавления 1: 11010011 = −45.
- Проверка по весам: −128 + 64 + 16 + 2 + 1 = −45.
- Теперь 25 + (−12). 25 = 00011001; 12 = 00001100, после инверсии 11110011, плюс 1: 11110100 = −12.
- Сумма: 00011001 + 11110100 = 1 00001101. Перенос, выходящий из бита 8, отбрасывается.
- Результат: 00001101 = 13. Верно.
Код BCD
В коде BCD (двоично-десятичный код, вариант 8421) каждая десятичная цифра представляется отдельно, 4 битами. Так, 395 записывается как 0011 1001 0101. Это не то же самое, что перевести 395 в двоичную систему (1100010112): BCD занимает больше бит, зато каждую группу можно без всяких делений подать прямо на дешифратор 7-сегментного индикатора. Коды от 1010 до 1111 в BCD недопустимы; при проектировании такие комбинации обычно считают безразличными условиями в картах Карно.
Код Грея
В коде Грея при переходе от одного значения к следующему меняется только один бит. В обычном двоичном коде при переходе от 7 (0111) к 8 (1000) меняются сразу все четыре бита; если датчик считывает значение как раз в момент перехода, он может на мгновение увидеть любое промежуточное значение. С кодом Грея такой ошибки не бывает, поэтому его применяют в энкодерах положения, в счётчиках, значения которых передаются из одного тактового домена в другой, и в заголовках карт Карно.
- Из двоичного кода в код Грея: старший бит копируется; каждый следующий бит — это XOR соответствующего двоичного бита с двоичным битом слева от него. В виде формулы: g = b ⊕ (b, сдвинутое на один разряд вправо).
- Из кода Грея в двоичный: старший бит копируется; каждый следующий двоичный бит — это XOR только что полученного двоичного бита с битом кода Грея в этой позиции.
| Десятичное | Двоичное | Код Грея | Десятичное | Двоичное | Код Грея |
|---|---|---|---|---|---|
| 0 | 0000 | 0000 | 8 | 1000 | 1100 |
| 1 | 0001 | 0001 | 9 | 1001 | 1101 |
| 2 | 0010 | 0011 | 10 | 1010 | 1111 |
| 3 | 0011 | 0010 | 11 | 1011 | 1110 |
| 4 | 0100 | 0110 | 12 | 1100 | 1010 |
| 5 | 0101 | 0111 | 13 | 1101 | 1011 |
| 6 | 0110 | 0101 | 14 | 1110 | 1001 |
| 7 | 0111 | 0100 | 15 | 1111 | 1000 |
Пример 3: двоичное 1011 в код Грея и обратно.
- Скопируйте первый бит: 1.
- 1 ⊕ 0 = 1; 0 ⊕ 1 = 1; 1 ⊕ 1 = 0. Код Грея = 1110.
- Обратно: скопируйте первый бит, b3 = 1. Затем b2 = 1 ⊕ 1 = 0, b1 = 0 ⊕ 1 = 1, b0 = 1 ⊕ 0 = 1. Двоичное = 1011.
В таблице десятичному числу 11 соответствует код Грея 1110: совпадает.
Типичные ошибки
- Группировать биты для восьмеричной или шестнадцатеричной записи, начиная слева. Группировать нужно всегда от младшего бита.
- Забывать «+1» при получении дополнительного кода. Одна только инверсия даёт обратный код, в котором два нуля и другой диапазон.
- Читать 11010011 как 211, когда регистр хранит число со знаком. Один и тот же набор бит равен 211 без знака или −45 со знаком: всё зависит от соглашения.
- Путать BCD с двоичным кодом. Число 25 в BCD — это 0010 0101, а в двоичной системе — 11001.
- При переводе из кода Грея в двоичный выполнять XOR с соседним битом кода Грея, а не с только что вычисленным двоичным битом.
Попробуйте в симуляторе
Эти представления можно увидеть «вживую» с помощью нескольких входов и выходов, а перевод в код Грея — проверить на элементах XOR.
- Поместите четыре входа в качестве битов от b3 до b0 и подключите индикатор или четыре светодиода, чтобы видеть значение.
- Добавьте три элемента XOR: g2 = b3 ⊕ b2, g1 = b2 ⊕ b1, g0 = b1 ⊕ b0, а b3 соедините напрямую с g3.
- Меняйте входы от 0000 до 1111 и наблюдайте по выходам, что при переходе от одного значения к следующему меняется только один бит кода Грея.
- Постройте таблицу истинности схемы и сравните её с таблицей из этой статьи.
Упражнения
- Переведите 110101102 в шестнадцатеричную и в десятичную системы.
Ответ
1101 0110 = D616 = 13·16 + 6 = 214.
- Переведите 200 в двоичную и в шестнадцатеричную системы.
Ответ
200 = 128 + 64 + 8 = 110010002 = C816.
- Представьте −100 в дополнительном коде в 8 битах.
Ответ
100 = 01100100; после инверсии 10011011; плюс 1: 10011100. Проверка: −128 + 16 + 8 + 4 = −100.
- Переведите десятичное число 6 в 4-битный код Грея, а BCD-код 0111 0010 — в десятичное число.
Ответ
6 = 0110; код Грея: 0, 0 ⊕ 1 = 1, 1 ⊕ 1 = 0, 1 ⊕ 0 = 1 → 0101. BCD-код 0111 0010 — это 72.
Чтобы увидеть, как схема складывает и вычитает такие числа, переходите к теме «двоичные сумматоры».