Binary 转 BCD 码

在数字电路中,经常会遇到进制转换问题,如二进制 (Binary) 转 BCD (Binary-Coded Decimal)。针对这种数制的转换,有个很神奇的算法——double dabble algorithm,也称为 shift and add 3 algorithm

其主要流程如下(摘自wiki-Double_dabble):
Performed on the value $ {243_{10}} $, looks like this:

但是为何这样工作就能得到BCD码呢?

我们考虑两个BCD码的加法 1001|0111 与 1000|0110,低四位 0111 与 0110 相加的结果是1101,这是一个不合法的BCD码,我们需要对它进行调整:加6 (0110),所得结果为 1|0011 。

在 double dabble 算法中,我们从最高位开始进行移位,相当于一个“原数×2 + 新数”的过程,想象成十进制的过程更好理解:134 = ((1×10)+3)×10+4 。
在算法的移位过程中,就有一个旧的BCD码数,我们对这个BCD码×2 (相当于 BCD码+BCD码),若乘2后某位(二进制4位长度)结果大于9,则超出合理的BCD码位置,我们就要对其进行加6调整。如若,在乘法前,判断出该位数大于4 (>=5),那么我们就对其进行加三调整,不就和上面过程结果一致了吗!

参考文献: