Цитата(Neytrino @ Oct 19 2009, 14:16)

А можно, если конечно не сложно, разжевать это мне, я что-то не совсем понял данной статьи, если быть точнее как производить коррекцию и как вычислить в функции те самые недопустимые комбинации
В стандартном BCD (с весами битов 8-4-2-1) каждая десятичная цифра однозначно представляется 4-мя битами (тетрадой):
0 - 0000
1 - 0001
2 - 0010
...
9 - 1001
Остальные 6 комбинаций (1010, ... , 1111) являются недопустимыми. (угадайте, почему коррекция выполняется именно на 6?)

Если расписать (на бумажке), н-р, сложение двух BCD-чисел
Код
BCD BIN
11 0001 0001
+
22 0010 0010
=
33 0011 0011 // без переносов между тетрадами вообще никакой разницы с обычным двоичным сложением
35 0011 0101
+
74 0111 0100
=
1010 1001 // если в какой-то тетраде цифра>9, то приключился BCD-перенос
+
0110 0000 // добавляем коррекцию к каждой тетраде, в которой приключился перенос
=
109 0001 0000 1001 // и не забываем про перенос в следующий BCD-разряд, вес которого, естесно, уже 100
Вычитание - аналогично.
Да и для любого произвольного основания системы счисления тоже аналогично.
Как уже сказал
rezident, развлекаться арифметикой непосредственно в BCD смысла нет - проще BCD перевести в обычный двоичный формат, выполнить необходимые вычисления, и перевести результат обратно в BCD.
В конфе уже не раз обсуждались способы BIN->BCD. Самое неприятное в таких преобразованиях (на контроллерах без аппаратного деления) - деление на 10. Для целочисленной арифметики жизнь можно облегчить, н-р, таким образом:
Код
Деление на 10:
8 bit: Y = (X * 0xCD) >> 11;
16 bit: Y = (X * 0xCCCD) >> 19;
32 bit: Y = (X * 0xCCCCCCCD) >> 35;