加三移位法-二进制数转换为BCD码

      二进制转换为BCD码通常使用除法运算求个位、十位、百位等权位上的数,但由于除法取模占用资源太多,且当二进制数位数过多时,使用汇编语言在8位的51单片机中难以实现,所以常用加三移位法将任意位数的二进制数转换为BCD码。

      加三移位法的举例 (例子摘自http://www.360doc.com/content/11/0223/17/5169677_95465965.shtml):

  加三移位法-二进制数转换为BCD码

 加三移位法的原理:

      1.四位二进制大于15则进位(1111B->10000B),四位BCD码大于9则进位(1001->10000),若使四位二进制数大于9时就进位,即1111B->10101,刚好就是15的BCD码,即四位二进制逢9则加6,就等于其BCD码了。

       2.那么5位二进制怎么转换呢?拿11110B (30D) 来举例,11110B由1111B左移一位即乘二得到,将15的BCD码10101也左移一位,得00101010,新低四位的值1010由旧低四位的值0101乘以二得来,高四位同理,由于新低四位1010大于9,所以进位,得00110000刚好是30.

      3.由上一步看出,只要通过左移及逢9进1,则可转换任意位2进制数为BCD码。

      4.但该算法是加三移位,而不是移位加六。因为前者比后者占用资源少,但在算法上两者是等价的,前者先判断数是否大于等于5,若大于等于5则加3,再移位,即(5+3)*2 = 16(进1);后者是先移位后判断是否大于等于10,若大于等于10则加6,也是16(进1).

     5.先加3后移位算法有一点需要注意,到最后四位的时候无需判断是否大于等于5,因为后面没有移位的步骤了,不能实现步骤4中所述的等价原理。