Двійково-десятковий код

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до: навігація, пошук

Двійко́во-десятко́вий код (ДДК, англ. BCD, binary-coded decimal) —- спосіб представлення десяткового числа, у якому кожній цифрі відповідає певна послідовність двійкових розрядів. Цей код (а точніше, його різновид 8421-ДДК) спрощує ввід/вивід числа у десятковому вигляді, використовується у калькуляторах та при роботі над числами з фіксованою крапкою (наприклад, з грішми) для забезпечення належної точності підрахунків. Реалізація BCD-арифметики досить проста, тому вона присутня у наборах інструкцій майже всіх мікропроцесорів та мікроконтролерів.

Найпростішим варіантом є 8421-ДДК, який означає, що кожна цифра десяткового числа записується своїм двійковим представленням з доповненням нулями до 4 розрядів (тетрада). Наприклад, число 309110, при кодуванні у 8421-ДДК буде виглядати як 0011 0000 1001 0001 2

Правила побудови ДДК[ред.ред. код]

Оскільки всього існує 10 десяткових цифр, а одна тетрада (4 біта) може визначати 24 = 16 різних комбінацій, то очевидно, що існує більше ніж один можливий варіант побудови ДДК. Кількість можливих комбінацій дорівнює 16!\cdot(16-10)!=16!\cdot 6!\approx 2.6\cdot 10^{10}. Більшість цих можливих комбінацій подібні, тому для стандартизації був вибраний спеціальний алгоритм генерації ДДК.

Кожному розряду ДДК ставиться якась фіксована вага. Умови побудови коду:

  1. Ваги розрядів розміщуються у порядку зростання (від молодшого розряду до старшого)
  2. Вага найменшого розряду q0 дорівнює 1
  3. Вага наступного розряду q1 дорівнює 1 або 2
  4. Ваги інших 2 розрядів підбираються так, щоб їхня сума була більша або рівна 6 (якщо q1 = 2) або 7 (якщо q1 = 1)
  5. q3 <= q2 + q1 + q0 + 1

По таким правилам можлива побудова 17 різних кодів: 8-4-2-1, 7-4-2-1, 6-4-2-1, 5-4-2-1, 4-4-2-1, 7-3-2-1, 6-3-2-1, 5-3-2-1, 4-3-2-1, 3-3-2-1, 6-2-2-1, 5-2-2-1, 4-2-2-1, 6-3-1-1, 5-3-1-1, 4-3-1-1, 5-2-1-1

Кодування[ред.ред. код]

Для перетворення десяткової цифри у ДДК потрібно визначити, ваги яких розрядів утворюють у сумі дану цифру і поставити на їх місце одинички, а інші розряди заповнити нулями. Так, при кодування цифри 5 за допомогою 5221-ДДК видно, що q3 = 5, а отже 510 = 10005221-ДДК. Разом з тим, у даного коду є неоднозначність кодування, абсолютно коректним кодуванням буде 510 = 01115221-ДДК, оскільки q2 + q1 + q0 = 5. Неоднозначність кодування присутня у всіх кодах окрім 8421-ДДК.

Декодування[ред.ред. код]

Декодування тетради ДДК відбувається як сумування ваг розрядів, навпроти яких записана 1 у двійковому представлені. Напркилад, 10106321-ДДК = 6·1 + 3·0 + 2·1 + 1·0 = 6 + 2 = 810. На відміну від кодування, декодування завжди однозначне.

Заборонені комбінації[ред.ред. код]

Якщо у ДДК q3 + q2 + q1 + q0 > 9, то це означає, що код містить заборонені комбінації (ті, що декодуються у числа більше 9, тобто, не у цифру). Деякі системи використовують заборонені комбінації для представлення знаку, десяткової крапки тощо.

BCD[ред.ред. код]

BCD, який являє собою 8421-ДДК, виділяється серед інших двійково-десяткових кодів кількома особливостями:

  • Ваги розрядів коду являють собою степені двійки, а отже кодування цифри зводиться до простого переведення у двійкову систему, що є досить відомою операцією
  • Однозначне кодування — не може бути 2 тетрад, які будуть позначати одну цифру
  • 6 заборонених комбінації —- їх можна використати для позначення знаку, десяткової крапки, експоненти тощо.

Через ці особливості (а точніше, через першу) даний ДДК зручно використовувати для збереження десяткових чисел у комп'ютерах. До переваг можна віднести елементарність операції округлення, елементарність множення на 10.

Упакований та неупакований формати[ред.ред. код]

Оскільки мінімальною одиницею даних у процесорах як правило є байт, а не тетрада, то це призвело до появи двох форматів зберігання BCD в пам'яті. Неупакований формат зберігає кодовану цифру у молодшій тетраді байта, а старшу обнуляє. Упакований записує молодшу цифру у молодшу тетраду, а старшу — у старшу тетраду. Тому у неупакованому форматі один байт може містити числа від 0 до 9, а в упакованому — числа від 0 до 99. Неупакований формат зручний для перетворення цифри у ASCII-символ і округлення, а упакований — для арифметичних операцій і компактності даних. Процесори, які підтримують обидва формати, можуть містити також команди для переводу з одного формату в інший.

BCD-арифметика[ред.ред. код]

Для процесорів, які націлені на двійкові арифметичні операції, виконання двійково-десяткових операцій не є складним, проте створює незручності для програміста. Це пов'язано з існуванням заборонених комбінацій. В даному прикладі показано, що в деяких випадках над упакованими BCD числами можна виконувати звичайні бінарні операції

0001 0001 + 0000 0110 = 0001 0111
   1    1 +    0    6 =    1    7

Проте, якщо сума розрядів виявиться більшою 9, то результат стане некоректним:

0001 1001 + 0000 0110 = 0001 1111
   1    9 +    0    6 =    1 ####   

Комбінація 1111 у 8421-ДДК є забороненою, тому результат виявився неправильним. Для вирішення даної проблеми потрібно виконати десяткову корекцію числа після виконання арифметичної операції. Суть десяткової корекції у тому, що якщо у тетраді утворилась заборонена комбінація або відбувся переніс біта з 3 у 4 розряди (рахуючи від нульового), то до відповідної тетради результату додається число 610 або 01102:

0001 1001 + 0000 0110 = 0001 1111
   1    9 +    0    6 =    1 ####   
                      + 0000 0110
                        ---------
                        0010 0101   
                           2    5
0101 1001 + 0111 1001 = 1101               0010
   5    9 +    7    9 = заборонена комб.   був переніс біта
                      + 0110               0110
                        -----------------------
                    (1) 0011               1000   
                           3                  8

Наявність біту переповнення після виконання операції означає, що відбувся переніс у розряд сотень. За рахунок даної особливості у деяких операціях діапазон двійково-десяткових чисел, які кодуються одним байтом, розширений від 0 до 199. У цьому випадку результат дорівнює (1) 38, тобто, число 138.

Посилання[ред.ред. код]