我有三个问题,它们都与二进制编码的十进制(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;}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;iR*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发布于 2011-05-26 21:35:17
可以简单得多..。
#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;
}发布于 2011-05-26 14:30:08
您可以通过这样的操作来避免pow:
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;
}基本上是向后数,然后每次只需要乘以这个因子。类似的技巧应该适用于其他方法。
https://codereview.stackexchange.com/questions/2623
复制相似问题