我正在将BCD数字的位数向左或向右移动,以快速实现乘以或除以2。这里是一个快速向左移位的例子:
void LShift(unsigned char *arg)
{
int i, carry=0, temp;
for(i=2;i>=0;i--)
{
temp=(arg[i]<<1)+carry;
if (temp>9) temp+=6;
carry=temp>>4;
arg[i]=temp&0xF;
}
}
这个函数的效果很好,如果你传入一个数组 {4,5,6}
,它会返回 {9,1,2}
。问题在于,如果我想一次移动超过一个二进制位,就不得不一遍又一遍地调用这个函数。有没有什么聪明的办法可以在不先将BCD数转换为十进制数的情况下一次性移动超过一个二进制位?
{9,1,2}
?需要额外的输出数字(字节)吗?一般来说,对于大于1的移位,您可能需要许多额外的输出值字节。您可以将接口泛化为:size_t BCD_LShift(unsigned char *value, size_t vallen, size_t lshift, unsigned char *result, size_t reslen);
其中返回值是结果中BCD数字的数量。我想知道在函数重复调用和“转换为二进制整数,移位,转换为BCD”之间的断点在哪里? - Jonathan Leffler