0

我有一个大的(12 位)BCD 数字,编码为 6 个字节的数组 - 每个半字节都是一个 BCD 数字。我需要将它乘以 10^x,其中 x 可以是正数或负数。

我知道这可以通过半字节而不是位向左或向右移动来完成,但这是一个可怕的实现——尤其是在我正在使用的 Javacard 中。有没有更好的办法?

4

2 回答 2

1

您不必使用位移位(尽管这可能是最有效的方法)。

对于您的 12 位 BCD 数字,假设不会有任何溢出,假设 b[5] 到 b[0] 将您的字节从最高有效到最低有效,并且该 mod 是模数(余数)操作和 div是整数除法,以下伪代码将乘以 10:

for i = 5 to 1
    b[i] = (b[i] mod 16) * 16 + b[i-1] div 16
b[0] = (b[0] mod 16) * 16

老实说,这可能比您的位移解决方案更丑陋,但是,只要您将它们中的任何一个封装在一个函数中,这并不重要。

我建议具有以下功能:

BcdArray mult10 (BcdArray ba, int shiftAmt);

这将通过应用 10 的幂返回一个修改后的数组。

任何 10 的偶数次方都是字节的简单副本(因为两个 nybbles 是一个字节),而只有 10 的奇数次方需要复杂的位移或余数/除法代码。

于 2009-01-05T10:56:14.577 回答
1

半点移动是最有效的方法。

如果性能不是您的问题,并且您希望获得最易读的版本,您可能需要将 BCD 数字转换为字符串并移动小数点。

如果您没有小数点(例如您的数字是整数),您可以在 x > 0 时连接零,或者在 x < 0 时删除最后的 -x 字符。

然后将字符串转换回 BCD。注意溢出以及删除所有字符并以空字符串结尾的情况。

于 2009-01-05T10:57:02.080 回答