搜索
bottom↓
回复: 17

请问下,4节字节的长整型数转换为BCD码,怎么样做最快呢。。

[复制链接]

出0入0汤圆

发表于 2010-4-24 00:07:18 | 显示全部楼层 |阅读模式
假设一个,long int k = 1234567890;转换为,unsigned char k1[10];

这个应该怎么算比较好呢。比较常见的是,
for(i =0 ;i<10;i++)
{
k1 = k%10;
k/=10;
}

应该有更简单的吧。。
谢谢!

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2010-4-24 09:07:32 | 显示全部楼层
搜一下,坛里好像有的。

出0入0汤圆

发表于 2010-4-24 10:18:38 | 显示全部楼层
查表?

出0入0汤圆

 楼主| 发表于 2010-4-24 17:38:23 | 显示全部楼层
这个查表?怎么查,看另一个贴子用的是,先判断再用减法来做的。

出0入0汤圆

发表于 2010-4-24 22:27:04 | 显示全部楼层
帖一个我做的库:

NAME    LONG2BCD

?PR?_long2bcd?LONG2BCD                SEGMENT CODE INBLOCK
        PUBLIC  _long2bcd
; void long2bcd(unsigned long l, unsigned char * p)

        RSEG  ?PR?_long2bcd?LONG2BCD
_long2bcd:
        MOV     R3,     #0x05
        CLR     A
?C0001: MOV     @R1,    A
        INC     R1
        DJNZ    R3,     ?C0001

        MOV     A,      #0x08
        MOV     R2,     A
?C0002: XCH     A,      R4
        RLC     A
        XCH     A,      R4
        MOV     R3,     #0x02
?C0003: DEC     R1
        XCH     A,      @R1
        RLC     A
        MOV     0xD5,   C               ;PSW.5,F0
        ADD     A,      #0x33
        JB      0xE3,   ?C0004          ;ACC.3
        ADD     A,      #(-3)
?C0004: JB      0xE7,   ?C0005          ;ACC.7
        ADD     A,      #(-48)
?C0005: MOV     C,      0xD5            ;PSW.5,F0
        XCH     A,      @R1
        DJNZ    R3,     ?C0003
        INC     R1
        INC     R1
        DJNZ    R2,     ?C0002

        MOV     R2,     A
?C0006: XCH     A,      R5
        RLC     A
        XCH     A,      R5
        MOV     R3,     #0x03
?C0007: DEC     R1
        XCH     A,      @R1
        RLC     A
        MOV     0xD5,   C
        ADD     A,      #0x33
        JB      0xE3,   ?C0008
        ADD     A,      #(-3)
?C0008: JB      0xE7,   ?C0009
        ADD     A,      #(-48)
?C0009: MOV     C,      0xD5
        XCH     A,      @R1
        DJNZ    R3,     ?C0007
        INC     R1
        INC     R1
        INC     R1
        DJNZ    R2,     ?C0006

        MOV     R2,     A
?C000A: XCH     A,      R6
        RLC     A
        XCH     A,      R6
        MOV     R3,     #0x04
?C000B: DEC     R1
        XCH     A,      @R1
        RLC     A
        MOV     0xD5,   C
        ADD     A,      #0x33
        JB      0xE3,   ?C000C
        ADD     A,      #(-3)
?C000C: JB      0xE7,   ?C000D
        ADD     A,      #(-48)
?C000D: MOV     C,      0xD5
        XCH     A,      @R1
        DJNZ    R3,     ?C000B
        INC     R1
        INC     R1
        INC     R1
        INC     R1
        DJNZ    R2,     ?C000A

        MOV     R2,     A
?C000E: XCH     A,      R7
        RLC     A
        XCH     A,      R7
        MOV     R3,     #0x05
?C000F: DEC     R1
        XCH     A,      @R1
        RLC     A
        MOV     0xD5,   C
        CJNE    R2,     #1,     ?C0010
        SJMP    ?C0012
?C0010: ADD     A,      #0x33
        JB      0xE3,   ?C0011
        ADD     A,      #(-3)
?C0011: JB      0xE7,   ?C0012
        ADD     A,      #(-48)
?C0012: MOV     C,      0xD5
        XCH     A,      @R1
        DJNZ    R3,     ?C000F
        INC     R1
        INC     R1
        INC     R1
        INC     R1
        INC     R1
        DJNZ    R2,     ?C000E

        RET         

        END


所用算法的流程图 (原文件名:hex2bcd.JPG)

C语言的调用接口已在程序中以注释的方式给出,需要注意的是,程序需要传递一个通用指针进去,但函数内部的代码实际上只能处理该指针为“unsigned char data *”的形式,也就是说,存储BCD码结果的数组只能在DATA区。结果为压缩BCD码,存于传进来的指针所指的5个元素的数组。

附上库文件工程包、测试工程包:
生成.LIB库文件的工程包ourdev_549026.rar(文件大小:5K) (原文件名:long2bcd.rar)
功能测试及、与除法及取模运算方式对比的工程包ourdev_549027.rar(文件大小:7K) (原文件名:temp.rar)

在标准51架构上,该函数使用2174周期、而作为对比的除法/取模方式要用4700周期。
本想使用div/ldiv库来改善除法/取模方式的效率,结果查阅Keil的帮助才发现,Keil C不支持这两个ANSI-C的库,看样子有必要自己写一个。

出0入0汤圆

发表于 2010-4-24 23:30:08 | 显示全部楼层
hao

出0入0汤圆

发表于 2010-4-24 23:34:58 | 显示全部楼层
学习了

出0入0汤圆

 楼主| 发表于 2010-4-25 00:31:00 | 显示全部楼层
谢谢了

出0入0汤圆

发表于 2010-4-25 00:32:46 | 显示全部楼层
回复【7楼】newc
谢谢了,都降到400周期左右了。
-----------------------------------------------------------------------

说说是怎么实现的?

出0入0汤圆

 楼主| 发表于 2010-4-25 00:33:29 | 显示全部楼层
刚才测错了。。-。-!断点打错位置了

出0入0汤圆

发表于 2013-7-14 14:11:20 | 显示全部楼层
eduhf_123 发表于 2010-4-24 22:27
帖一个我做的库:

NAME    LONG2BCD

SIR:

THE CODE CAN'T DOWNLOAD IT?

THANKS.

出0入0汤圆

发表于 2013-7-14 14:43:24 | 显示全部楼层
jlian168 发表于 2013-7-14 14:11
SIR:

THE CODE CAN'T DOWNLOAD IT?

流程图如下:


生成LIB文件的库:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2013-7-14 15:04:11 | 显示全部楼层
eduhf_123 发表于 2013-7-14 14:43
流程图如下:

SIR:

THANK YOU.

WHERE IS THE "temp.rar".

THANKS AGAIN.

出0入0汤圆

发表于 2013-7-14 18:25:33 | 显示全部楼层
jlian168 发表于 2013-7-14 15:04
SIR:

THANK YOU.

Seems to be lost.

出0入0汤圆

发表于 2013-7-14 21:49:01 | 显示全部楼层
eduhf_123 发表于 2013-7-14 14:43
流程图如下:

呵呵,不懂用呀!

出0入12汤圆

发表于 2013-7-17 21:45:39 | 显示全部楼层
学习备用谢谢分享

出0入0汤圆

发表于 2016-10-25 14:52:11 | 显示全部楼层
顶一下,不错必须的

出0入0汤圆

发表于 2016-11-10 17:04:22 | 显示全部楼层
谢谢!!!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-27 09:56

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表