首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解码二进制编码十进制(BCD)值

解码二进制编码十进制(BCD)值
EN

Code Review用户
提问于 2011-05-26 09:44:53
回答 2查看 10.5K关注 0票数 5

我有三个问题,它们都与二进制编码的十进制(BCD)转换有关。我的代码片段如下所示。但是我不喜欢我的算法,因为处理大量数据需要花费太多的时间。

有什么改善表现的建议吗?你能告诉我一种高效快捷的方法吗?

  1. 该值用4位二进制编码小数(BCD)表示,它最初存储在字符缓冲区中(例如,指针const unsigned char *指向)。BCD*2;1001 0111 0110 0101=9765 "9“"7”"6“"5”无符号int BCDn(无符号int n,const unsigned char * data ){ unsigned int uResult = 0;unsigned char ucTmp;int iTmp1,iTmp2;for (unsigned int i=0;i> 4;iTmp2 = ucTmp & 0x0f;uResult += (iTmp1*10+iTmp2) * static_cast(pow(100.0,static_cast(n-1-I);}返回uResult;}
  2. 该值由n二进制整数(n* 8位)表示.第一个位(MSB)定义二进制整数的符号;"0“表示它是正整数,"1”表示负整数。在负数的情况下,其他位显示加法的补数:1.msb LSB I*2;00101101 1001100=19999 I*2;10101101 10011100=(-1)*(0101101 10011100 =(-1)*(1010010 01100100) (补后) =-21092 int SINTn(无符号int n,const无符号char *data) { int nResult;bool bNegative = false;if ((data0 & 0x80)!= 0) isNegative = true;nResult = data0 & 0x7f;for (unsigned int i=1;i(pow(2.0,static_cast(n*8-1);返回nResult }无符号int UINTn(unsigned int n,const unsigned char *data) { unsigned int uResult = 0;for (unsigned int i=0;i
  3. R*n.m值用n字节(n*8位)二进制数表示,第一个位(MSB)定义它的符号;"0“表示正,"1”表示负。这个数字m表示二进制数应该乘以10-m才能得到这个值。MSB *4.0: 00000000 00000000 00000111 10110101=1973 R*4.2: 00000000 0000000000111 10110101=1973*10-2=19.73R*4.5:100000000000000000111 10110101=-1973*10-5= -0.01973 R*2.0: 101011010011100 =-11676双REALnm(无符号int n,未签名int m,const未签名字符*数据){ double dResult;bool bNegative = false;if ((data0 & 0x80)!= 0) isNegative = true;dResult = data0 & 0x7f;for (unsigned int i=1;i
EN

回答 2

Code Review用户

发布于 2011-05-26 21:35:17

可以简单得多..。

代码语言:javascript
复制
#include "seatest.h"

unsigned int BCDn( unsigned int n, const unsigned char * data )
{
    unsigned int uResult = 0;
    unsigned int i;

    for (i=0;i<n;i++) 
    {
        uResult = (uResult * 100) + ((data[i] >> 4) * 10 ) + ( data[i] & 0x0F);     
    }

    return uResult; 
}
void test_max_bcd_convert()
{   
    unsigned char bcd_data[]= { 0x97, 0x65 };

    assert_int_equal(9765, BCDn(2, bcd_data));

}

void test_fixture_bcd( void )
{
    test_fixture_start();      
    run_test(test_max_bcd_convert);   
    test_fixture_end();       
}

void all_tests( void )
{
    test_fixture_bcd();   
}

int main( int argc, char** argv )
{
    run_tests(all_tests);   
    return 0;
}
票数 4
EN

Code Review用户

发布于 2011-05-26 14:30:08

您可以通过这样的操作来避免pow:

代码语言:javascript
复制
unsigned int BCDn( unsigned int n, const unsigned char * data )
{
    unsigned int uResult = 0;
    unsigned char ucTmp;
    int iTmp1,iTmp2;

    unsigned int factor = 1;
    for (unsigned int i=n-1;i>=0;i--)
    {
        ucTmp = data[i];
        iTmp1 = (ucTmp & 0xf0) >> 4;
        iTmp2 = ucTmp & 0x0f;
        uResult += (iTmp1*10+iTmp2) * factor;
        factor *= 100;
    }

    return uResult; 
}

基本上是向后数,然后每次只需要乘以这个因子。类似的技巧应该适用于其他方法。

票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/2623

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档