打印

看到一个要分离个十百千万的函数的朋友

[复制链接]
2385|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
weizheng07|  楼主 | 2011-9-8 13:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
严重声明一下,这个算法不是本人搞得,其实就是HextoBCD,只是我觉得算法挺不错,匠人看到没?是不是觉得很熟悉阿?这个来自于你的匠人手记里介绍的算法.比较不错,能节省很多资源.哈哈哈
unsigned long HexToBCD(unsigned int uiData)
{
unsigned long uiBuf = 0;
unsigned int ucCount = 0;
for(ucCount = 0;ucCount < 15;ucCount ++)
  {
     if (uiData & 0x8000) uiBuf |= 0x01;
   uiData <<= 1;        
        if((uiBuf + 0x03)&0x0008)
   uiBuf += 3;
        if((uiBuf + 0x30)&0x0080)
   uiBuf += 0x30;
        if((uiBuf + 0x300)&0x0800)
   uiBuf += 0x300;
        if((uiBuf + 0x3000)&0x8000)
   uiBuf += 0x3000;
  if((uiBuf + 0x30000)&0x80000)
   uiBuf += 0x30000;

        uiBuf <<= 1;
}
if (uiData & 0x8000) uiBuf |= 0x01;
return uiBuf;
}

相关帖子

沙发
weizheng07|  楼主 | 2011-9-8 13:29 | 只看该作者
再来一个BCDtoHex的
/**************************************************************
函数名:BCDtoHex()
输入:
输出:
功能:
***************************************************************/
unsigned int BCDtoHex(unsigned int uiData)
{
        unsigned int uiBuf = 0x00;
        unsigned char ucCounter;

        for(ucCounter = 0; ucCounter < 15;ucCounter ++)
                {
        if (uiData & 0x01) uiBuf |= 0x8000;
                uiData >>= 1;
               
                if(uiData&0x0008)
                        uiData -= 3;
        if(uiData&0x0080)
                        uiData -= 0x30;
        if(uiData&0x0800)
                        uiData -= 0x300;
        if(uiData &0x8000)
                        uiData -= 0x3000;
        uiBuf >>= 1;
          }

        return uiBuf;

}

使用特权

评论回复
板凳
weizheng07|  楼主 | 2011-9-8 13:35 | 只看该作者
赫赫,匠人呢,不给我来个酷,也该给你自己来个阿

使用特权

评论回复
地板
ayb_ice| | 2011-9-8 15:36 | 只看该作者
本帖最后由 ayb_ice 于 2011-9-8 15:55 编辑

这个不见的比除法高效

使用特权

评论回复
5
ayb_ice| | 2011-9-8 15:57 | 只看该作者
本帖最后由 ayb_ice 于 2011-9-9 15:36 编辑

下面的除法程序已经证明比LZ的程序高效,简单
有兴趣的话可以自己去测试一下,我测试了两个参数10和65535
而且还可以大大优化接近一半
U8 bcd2[5];

void hex_to_bcd(U16 hex)
{

U8 i;
for(i=0; i<5; i++){
  bcd2 = hex%10;
  hex /= 10;
}

}

使用特权

评论回复
6
weiyg8051| | 2011-9-9 13:47 | 只看该作者
本帖最后由 weiyg8051 于 2011-9-9 13:49 编辑

楼上的,少了点东西,指针没移动

使用特权

评论回复
7
ayb_ice| | 2011-9-9 15:37 | 只看该作者
本帖最后由 ayb_ice 于 2011-9-9 15:39 编辑
楼上的,少了点东西,指针没移动
weiyg8051 发表于 2011-9-9 13:47

奇怪了,居然不让加"中括号",不知为什么,本来bcd2 后面是有括号的
void hex_to_bcd(U16 hex)
{
U8 i;
for(i=0; i<5; i++){
  bcd2 = hex%10;
  hex /= 10;
}
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

41

主题

507

帖子

2

粉丝