在数字电路中,经常会遇到进制转换问题,如二进制 (Binary) 转 BCD (Binary-Coded Decimal)。针对这种数制的转换,有个很神奇的算法——double dabble algorithm,也称为 shift and add 3 algorithm。
其主要流程如下(摘自wiki-Double_dabble):
Performed on the value 2431024310, 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),那么我们就对其进行加三调整,不就和上面过程结果一致了吗!(补充:乘2前<=4,则乘2后<=8,新数只能是1或者0,因此原数×2 + 新数<=9,是始终满足BCD码的条件的)
最后一次移位完就不需要满5加3了,因为此时已经满足了BCD码的条件,且后续不需要移位。
参考文献:
- An Explanation of the Double-Dabble Bin-BCD Conversion Algorithm
- Why the Double-Dabble Algorithm Works
本文转载于https://qqdaiyu55.github.io/2015/11/26/convert-bin-to-BCD/