Кодировка Чэнь-Хо — это альтернативная система двоичного кодирования десятичных цифр, которая эффективно использует память.
Традиционная система двоичного кодирования десятичных цифр, известная как двоично-десятичное кодирование (BCD), использует четыре бита для кодирования каждой цифры, что приводит к значительной потере пропускной способности двоичных данных (поскольку четыре бита могут хранить 16 состояний, а используются для хранения только 10) [1] даже при использовании упакованного BCD .
Кодирование сокращает требования к хранению двух десятичных цифр (100 состояний) с 8 до 7 бит, а трех десятичных цифр (1000 состояний) с 12 до 10 бит, используя только простые булевы преобразования, избегая сложных арифметических операций, таких как преобразование оснований .
В том, что, по-видимому, было множественным открытием , некоторые концепции, лежащие в основе того, что позже стало известно как кодирование Чэнь-Хо, были независимо разработаны Теодором М. Герцем в 1969 году [2] и Тянь Чи Ченом (陳天機) (1928–) [3] [4] [5] [6] в 1971 году.
Герц из Роквелла подал заявку на патент на свое кодирование в 1969 году, который был выдан в 1971 году. [2]
Чэнь впервые обсудил свои идеи с Ирвингом Цзе Хо (何宜慈) (1921–2003) [7] [8] [9] [10] в 1971 году. Чэнь и Хо оба работали в IBM в то время, хотя и в разных местах. [11] [12] Чэнь также консультировался с Фрэнком Чин Туном [13] , чтобы независимо проверить результаты своих теорий. [12] IBM подала патент на их имя в 1973 году, который был выдан в 1974 году. [14] По крайней мере к 1973 году ранняя работа Герца должна была быть им известна, поскольку патент ссылается на его патент как на предшествующий уровень техники . [14]
При участии Джозефа Д. Ратледжа и Джона К. Макферсона [15] окончательная версия кодировки Чена–Хо была распространена внутри IBM в 1974 году [16] и опубликована в 1975 году в журнале Communications of the ACM . [15] [17] Эта версия включала несколько уточнений, в первую очередь связанных с применением системы кодировки. Она представляет собой префиксный код типа Хаффмана .
Кодирование упоминалось как схема Чена и Хо в 1975 году [18] , кодирование Чена в 1982 году [19] и стало известно как кодирование Чена–Хо или алгоритм Чена–Хо с 2000 года. [17] После подачи патентной заявки на него в 2001 году [20] Майкл Ф. Коулишоу опубликовал дальнейшее усовершенствование кодирования Чена–Хо, известное как плотно упакованное десятичное (DPD) кодирование, в IEE Proceedings – Computers and Digital Techniques в 2002 году. [21] [22] Впоследствии DPD было принято в качестве десятичного кодирования, используемого в стандартах IEEE 754-2008 и ISO/IEC/IEEE 60559:2011 для чисел с плавающей точкой .
Чэнь отметил, что цифры от нуля до семи были просто закодированы с использованием трех двоичных цифр соответствующей восьмеричной группы. Он также предположил, что можно использовать флаг для идентификации другой кодировки для цифр восемь и девять, которые будут закодированы с использованием одного бита.
На практике к потоку входных битов применяется ряд булевых преобразований, сжимающих закодированные в BCD цифры с 12 бит на три цифры до 10 бит на три цифры. Обратные преобразования используются для декодирования полученного закодированного потока в BCD. Эквивалентные результаты также могут быть достигнуты с помощью таблицы поиска .
Кодирование Чена-Хо ограничено кодированием наборов из трех десятичных цифр в группы по 10 бит (так называемые деклеты ). [1] Из 1024 состояний, возможных при использовании 10 бит, оно оставляет неиспользованными только 24 состояния [1] (при этом биты don't care обычно устанавливаются в 0 при записи и игнорируются при чтении). При потерях всего 2,34% оно дает на 20% более эффективное кодирование, чем BCD с одной цифрой в 4 битах. [12] [17]
И Герц, и Чен также предложили похожие, но менее эффективные схемы кодирования для сжатия наборов из двух десятичных цифр (требующих 8 бит в BCD) в группы по 7 бит. [2] [12]
Большие наборы десятичных цифр можно разделить на трех- и двузначные группы. [2]
В патентах также обсуждается возможность адаптации схемы к цифрам, закодированным в любых других десятичных кодах, кроме 8-4-2-1 BCD , [2] например, Excess-3 , [2] Excess-6 , Jump-at-2 , Jump-at-8 , Gray , Glixon , O'Brien type-I и коде Gray–Stibitz . [a] Те же принципы можно применить и к другим основаниям.
В 1973 году некоторая форма кодирования Чена-Хо, по-видимому, использовалась в аппаратном обеспечении преобразования адресов дополнительной функции эмуляции IBM 7070 / 7074 для компьютеров IBM System/370 Model 165 и 370 Model 168. [23] [24]
В одном известном приложении 128-битный регистр используется для хранения 33 десятичных цифр с трехзначным показателем степени, что фактически не меньше того, что можно было бы получить с помощью двоичного кодирования (тогда как для кодирования BCD потребовалось бы 144 бита для хранения того же количества цифр).
Двоичное кодирование | Десятичные цифры | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Кодовое пространство (128 штатов) | б6 | б5 | б4 | б3 | б2 | б1 | б0 | д1 | д0 | Значения закодированы | Описание | Происшествия (100 штатов) | |
50% (64 штата) | 0 | а | б | с | г | е | ф | 0 абв | 0 по умолчанию | (0–7) (0–7) | Две младшие цифры | 64% (64 штата) | |
12,5% (16 штатов) | 1 | 1 | 0 | с | г | е | ф | 100 с | 0 по умолчанию | (8–9) (0–7) | Одна младшая цифра, одна старшая цифра | 16% (16 штатов) | |
12,5% (16 штатов) | 1 | 0 | 1 | ф | а | б | с | 0 абв | 100 ф | (0–7) (8–9) | 16% (16 штатов) | ||
12,5% (16 штатов, 4 использовано) | 1 | 1 | 1 | с | х | х | ф | 100 с | 100 ф | (8–9) (8–9) | Две старшие цифры | 4% (4 штата) | |
12,5% (16 штатов, 0 использовано) | 1 | 0 | 0 | х | х | х | х | 0% (0 штатов) |
Двоичное кодирование | Десятичные цифры | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Кодовое пространство (128 штатов) | б6 | б5 | б4 | б3 | б2 | б1 | б0 | д1 | д0 | Значения закодированы | Описание | Происшествия (100 штатов) | |
50% (64 штата) | 0 | а | б | с | г | е | ф | 0 абв | 0 по умолчанию | (0–7) (0–7) | Две младшие цифры | 64% (64 штата) | |
25% (32 штата, 16 использовано) | 1 | 0 | х [12] (б) [15] | с | г | е | ф | 100 с | 0 по умолчанию | (8–9) (0–7) | Одна младшая цифра, одна старшая цифра | 16% (16 штатов) | |
12,5% (16 штатов) | 1 | 1 | 0 | ф | а | б | с | 0 абв | 100 ф | (0–7) (8–9) | 16% (16 штатов) | ||
12,5% (16 штатов, 4 использовано) | 1 | 1 | 1 | с | х [12] (а) [15] | х [12] (б) [15] | ф | 100 с | 100 ф | (8–9) (8–9) | Две старшие цифры | 4% (4 штата) |
Двоичное кодирование | Десятичные цифры | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Кодовое пространство (128 штатов) | б6 | б5 | б4 | б3 | б2 | б1 | б0 | д1 | д0 | Значения закодированы | Описание | Происшествия (100 штатов) | |
50% (64 штата) | 0 | а | б | с | г | е | ф | 0 абв | 0 по умолчанию | (0–7) (0–7) | Две младшие цифры | 64% (64 штата) | |
12,5% (16 штатов) | 1 | 0 | с | 0 | г | е | ф | 100 с | 0 по умолчанию | (8–9) (0–7) | Одна младшая цифра, одна старшая цифра | 16% (16 штатов) | |
12,5% (16 штатов, 4 использовано) | 1 | 0 | с | 1 | х | х | ф | 100 с | 100 ф | (8–9) (8–9) | Две старшие цифры | 4% (4 штата) | |
12,5% (16 штатов) | 1 | 1 | ф | 0 | а | б | с | 0 абв | 100 ф | (0–7) (8–9) | Одна младшая цифра, одна старшая цифра | 16% (16 штатов) | |
12,5% (16 штатов, 0 использовано) | 1 | 1 | х | 1 | х | х | х | 0% (0 штатов) |
Двоичное кодирование | Десятичные цифры | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Кодовое пространство (128 штатов) | б6 | б5 | б4 | б3 | б2 | б1 | б0 | д1 | д0 | Значения закодированы | Описание | Происшествия (100 штатов) | |
50% (64 штата) | 0 | а | б | с | г | е | ф | 0 абв | 0 по умолчанию | (0–7) (0–7) | Две младшие цифры | 64% (64 штата) | |
25,0% (32 штата, 16 использовано) | 1 | 0 | х [14] (б) [15] | с | г | е | ф | 100 с | 0 по умолчанию | (8–9) (0–7) | Одна младшая цифра, одна старшая цифра | 16% (16 штатов) | |
12,5% (16 штатов) | 1 | 1 | 1 | с | а | б | ф | 0 абв | 100 ф | (0–7) (8–9) | 16% (16 штатов) | ||
12,5% (16 штатов, 4 использовано) | 1 | 1 | 0 | с | х [14] (а) [15] | х [14] (б) [15] | ф | 100 с | 100 ф | (8–9) (8–9) | Две старшие цифры | 4% (4 штата) |
Двоичное кодирование | Десятичные цифры | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Кодовое пространство (1024 состояния) | б9 | б8 | б7 | б6 | б5 | б4 | б3 | б2 | б1 | б0 | д2 | д1 | д0 | Значения закодированы | Описание | Происшествия (1000 штатов) | |
50,0% (512 штатов) | 0 | а | б | с | г | е | ф | г | час | я | 0 абв | 0 по умолчанию | 0 ги | (0–7) (0–7) (0–7) | Три младшие цифры | 51,2% (512 штатов) | |
37,5% (384 штата) | 1 | 0 | 0 | с | г | е | ф | г | час | я | 100 с | 0 по умолчанию | 0 ги | (8–9) (0–7) (0–7) | Две младшие цифры, одна старшая цифра | 38,4% (384 штата) | |
1 | 0 | 1 | ф | а | б | с | г | час | я | 0 абв | 100 ф | 0 ги | (0–7) (8–9) (0–7) | ||||
1 | 1 | 0 | я | а | б | с | г | е | ф | 0 абв | 0 по умолчанию | 100 я | (0–7) (0–7) (8–9) | ||||
9,375% (96 штатов) | 1 | 1 | 1 | ф | 0 | 0 | я | а | б | с | 0 абв | 100 ф | 100 я | (0–7) (8–9) (8–9) | Одна младшая цифра, две старшие цифры | 9,6% (96 штатов) | |
1 | 1 | 1 | с | 0 | 1 | я | г | е | ф | 100 с | 0 по умолчанию | 100 я | (8–9) (0–7) (8–9) | ||||
1 | 1 | 1 | с | 1 | 0 | ф | г | час | я | 100 с | 100 ф | 0 ги | (8–9) (8–9) (0–7) | ||||
3,125% (32 штата, 8 использовано) | 1 | 1 | 1 | с | 1 | 1 | ф | ( 0 ) | ( 0 ) | я | 100 с | 100 ф | 100 я | (8–9) (8–9) (8–9) | Три старшие цифры, биты b2 и b1 не имеют значения | 0,8% (8 штатов) |
Двоичное кодирование | Десятичные цифры | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Кодовое пространство (1024 состояния) | б9 | б8 | б7 | б6 | б5 | б4 | б3 | б2 | б1 | б0 | д2 | д1 | д0 | Значения закодированы | Описание | Происшествия (1000 штатов) | |
50,0% (512 штатов) | 0 | а | б | с | г | е | ф | г | час | я | 0 абв | 0 по умолчанию | 0 ги | (0–7) (0–7) (0–7) | Три младшие цифры | 51,2% (512 штатов) | |
37,5% (384 штата) | 1 | 0 | 0 | с | г | е | ф | г | час | я | 100 с | 0 по умолчанию | 0 ги | (8–9) (0–7) (0–7) | Две младшие цифры, одна старшая цифра | 38,4% (384 штата) | |
1 | 0 | 1 | ф | г | час | я | а | б | с | 0 абв | 100 ф | 0 ги | (0–7) (8–9) (0–7) | ||||
1 | 1 | 0 | я | а | б | с | г | е | ф | 0 абв | 0 по умолчанию | 100 я | (0–7) (0–7) (8–9) | ||||
9,375% (96 штатов) | 1 | 1 | 1 | 0 | 0 | ф | я | а | б | с | 0 абв | 100 ф | 100 я | (0–7) (8–9) (8–9) | Одна младшая цифра, две старшие цифры | 9,6% (96 штатов) | |
1 | 1 | 1 | 0 | 1 | я | с | г | е | ф | 100 с | 0 по умолчанию | 100 я | (8–9) (0–7) (8–9) | ||||
1 | 1 | 1 | 1 | 0 | с | ф | г | час | я | 100 с | 100 ф | 0 ги | (8–9) (8–9) (0–7) | ||||
3,125% (32 штата, 8 использовано) | 1 | 1 | 1 | 1 | 1 | с | ф | я | ( 0 ) | ( 0 ) | 100 с | 100 ф | 100 я | (8–9) (8–9) (8–9) | Три старшие цифры, биты b1 и b0 не имеют значения | 0,8% (8 штатов) |
Двоичное кодирование | Десятичные цифры | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Кодовое пространство (1024 состояния) | б9 | б8 | б7 | б6 | б5 | б4 | б3 | б2 | б1 | б0 | д2 | д1 | д0 | Значения закодированы | Описание | Происшествия (1000 штатов) | |
50,0% (512 штатов) | 0 | а | б | г | е | г | час | с | ф | я | 0 абв | 0 по умолчанию | 0 ги | (0–7) (0–7) (0–7) | Три младшие цифры | 51,2% (512 штатов) | |
37,5% (384 штата) | 1 | 0 | 0 | г | е | г | час | с | ф | я | 100 с | 0 по умолчанию | 0 ги | (8–9) (0–7) (0–7) | Две младшие цифры, одна старшая цифра | 38,4% (384 штата) | |
1 | 0 | 1 | а | б | г | час | с | ф | я | 0 абв | 100 ф | 0 ги | (0–7) (8–9) (0–7) | ||||
1 | 1 | 0 | г | е | а | б | с | ф | я | 0 абв | 0 по умолчанию | 100 я | (0–7) (0–7) (8–9) | ||||
9,375% (96 штатов) | 1 | 1 | 1 | 1 | 0 | а | б | с | ф | я | 0 абв | 100 ф | 100 я | (0–7) (8–9) (8–9) | Одна младшая цифра, две старшие цифры | 9,6% (96 штатов) | |
1 | 1 | 1 | 0 | 1 | г | е | с | ф | я | 100 с | 0 по умолчанию | 100 я | (8–9) (0–7) (8–9) | ||||
1 | 1 | 1 | 0 | 0 | г | час | с | ф | я | 100 с | 100 ф | 0 ги | (8–9) (8–9) (0–7) | ||||
3,125% (32 штата, 8 использовано) | 1 | 1 | 1 | 1 | 1 | ( 0 ) | ( 0 ) | с | ф | я | 100 с | 100 ф | 100 я | (8–9) (8–9) (8–9) | Три старшие цифры, биты b4 и b3 не имеют значения | 0,8% (8 штатов) |
Двоичное кодирование | Десятичные цифры | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Кодовое пространство (1024 состояния) | б9 | б8 | б7 | б6 | б5 | б4 | б3 | б2 | б1 | б0 | д2 | д1 | д0 | Значения закодированы | Описание | Происшествия (1000 штатов) | |
50,0% (512 штатов) | 0 | а | б | с | г | е | ф | г | час | я | 0 абв | 0 по умолчанию | 0 ги | (0–7) (0–7) (0–7) | Три младшие цифры | 51,2% (512 штатов) | |
37,5% (384 штата) | 1 | 0 | 0 | с | г | е | ф | г | час | я | 100 с | 0 по умолчанию | 0 ги | (8–9) (0–7) (0–7) | Две младшие цифры, одна старшая цифра | 38,4% (384 штата) | |
1 | 0 | 1 | с | а | б | ф | г | час | я | 0 абв | 100 ф | 0 ги | (0–7) (8–9) (0–7) | ||||
1 | 1 | 0 | с | г | е | ф | а | б | я | 0 абв | 0 по умолчанию | 100 я | (0–7) (0–7) (8–9) | ||||
9,375% (96 штатов) | 1 | 1 | 1 | с | 0 | 0 | ф | а | б | я | 0 абв | 100 ф | 100 я | (0–7) (8–9) (8–9) | Одна младшая цифра, две старшие цифры | 9,6% (96 штатов) | |
1 | 1 | 1 | с | 0 | 1 | ф | г | е | я | 100 с | 0 по умолчанию | 100 я | (8–9) (0–7) (8–9) | ||||
1 | 1 | 1 | с | 1 | 0 | ф | г | час | я | 100 с | 100 ф | 0 ги | (8–9) (8–9) (0–7) | ||||
3,125% (32 штата, 8 использовано) | 1 | 1 | 1 | с | 1 | 1 | ф | ( 0 ) | ( 0 ) | я | 100 с | 100 ф | 100 я | (8–9) (8–9) (8–9) | Три старшие цифры, биты b2 и b1 не имеют значения | 0,8% (8 штатов) |
БКД | Необходимые биты | Разница в битах | |||||||
---|---|---|---|---|---|---|---|---|---|
Цифры | Штаты | Биты | Двоичное кодовое пространство | Двоичное кодирование [A] | 2-значное кодирование [B] | 3-значное кодирование [C] | Смешанное кодирование | Смешанный против бинарного | Смешанный против BCD |
1 | 10 | 4 | 16 | 4 | (7) | (10) | 4 [1×А] | 0 | 0 |
2 | 100 | 8 | 128 | 7 | 7 | (10) | 7 [1×Б] | 0 | −1 |
3 | 1000 | 12 | 1024 | 10 | (14) | 10 | 10 [1×С] | 0 | −2 |
4 | 10 000 | 16 | 16 384 | 14 | 14 | (20) | 14 [2×Б] | 0 | −2 |
5 | 100 000 | 20 | 131 072 | 17 | (21) | (20) | 17 [1×С+1×В] | 0 | −3 |
6 | 1 000 000 | 24 | 1 048 576 | 20 | 21 | 20 | 20 [2×С] | 0 | −4 |
7 | 10 000 000 | 28 | 16 777 216 | 24 | (28) | (30) | 24 [2×С+1×А] | 0 | −4 |
8 | 100 000 000 | 32 | 134 217 728 | 27 | 28 | (30) | 27 [2×С+1×В] | 0 | −5 |
9 | 1 000 000 000 | 36 | 1 073 741 824 | 30 | (35) | 30 | 30 [3×С] | 0 | −6 |
10 | 10 000 000 000 | 40 | 17 179 869 184 | 34 | 35 | (40) | 34 [3×С+1×А] | 0 | −6 |
11 | 100 000 000 000 | 44 | 137 438 953 472 | 37 | (42) | (40) | 37 [3×С+1×В] | 0 | −7 |
12 | 1 000 000 000 000 | 48 | 1 099 511 627 776 | 40 | 42 | 40 | 40 [4×С] | 0 | −8 |
13 | 10 000 000 000 000 | 52 | 17 592 186 044 416 | 44 | (49) | (50) | 44 [4×С+1×А] | 0 | −8 |
14 | 100 000 000 000 000 | 56 | 140 737 488 355 328 | 47 | 49 | (50) | 47 [4×С+1×В] | 0 | −9 |
15 | 1 000 000 000 000 000 | 60 | 1 125 899 906 842 624 | 50 | (56) | 50 | 50 [5×С] | 0 | −10 |
16 | 10 000 000 000 000 000 | 64 | 18 014 398 509 481 984 | 54 | 56 | (60) | 54 [5×С+1×А] | 0 | −10 |
17 | 100 000 000 000 000 000 | 68 | 144 115 188 075 855 872 | 57 | (63) | (60) | 57 [5×С+1×Б] | 0 | −11 |
18 | 1 000 000 000 000 000 000 | 72 | 1 152 921 504 606 846 976 | 60 | 63 | 60 | 60 [6×С] | 0 | −12 |
19 | 10 000 000 000 000 000 000 | 76 | 18 446 744 073 709 551 616 | 64 | (70) | (70) | 64 [6×С+1×А] | 0 | −12 |
20 | … | 80 | … | 67 | 70 | (70) | 67 [6×С+1×В] | 0 | −13 |
21 | … | 84 | … | 70 | (77) | 70 | 70 [7×С] | 0 | −14 |
22 | … | 88 | … | 74 | 77 | (80) | 74 [7×С+1×А] | 0 | −14 |
23 | … | 92 | … | 77 | (84) | (80) | 77 [7×С+1×Б] | 0 | −15 |
24 | … | 96 | … | 80 | 84 | 80 | 80 [8×С] | 0 | −16 |
25 | … | 100 | … | 84 | (91) | (90) | 84 [8×С+1×А] | 0 | −16 |
26 | … | 104 | … | 87 | 91 | (90) | 87 [8×С+1×Б] | 0 | −17 |
27 | … | 108 | … | 90 | (98) | 90 | 90 [9×С] | 0 | −18 |
28 | … | 112 | … | 94 | 98 | (100) | 94 [9×С+1×А] | 0 | −18 |
29 | … | 116 | … | 97 | (105) | (100) | 97 [9×С+1×Б] | 0 | −19 |
30 | … | 120 | … | 100 | 105 | 100 | 100 [10×С] | 0 | −20 |
31 | … | 124 | … | 103 | (112) | (110) | 104 [10×С+1×А] | +1 | −20 |
32 | … | 128 | … | 107 | 112 | (110) | 107 [10×С+1×В] | 0 | −21 |
33 | … | 132 | … | 110 | (119) | 110 | 110 [11×С] | 0 | −22 |
34 | … | 136 | … | 113 | 119 | (120) | 114 [11×С+1×А] | +1 | −22 |
35 | … | 140 | … | 117 | (126) | (120) | 117 [11×С+1×В] | 0 | −23 |
36 | … | 144 | … | 120 | 126 | 120 | 120 [12×С] | 0 | −24 |
37 | … | 148 | … | 123 | (133) | (130) | 124 [12×С+1×А] | +1 | −24 |
38 | … | 152 | … | 127 | 133 | (130) | 127 [12×С+1×В] | 0 | −25 |
… | … | … | … | … | … | … | … | … | … |