我有一个大的(12位)BCD码,编码为6个字节的数组 - 每个半字节是一个BCD数字。我需要乘以10 ^ x,其中x可以是正数或负数。
我知道可以通过左手或右手移动而不是位移来完成,但这是一个可怕的实现 - 特别是在Javacard,这是我正在使用的。有没有更好的办法?
答案 0 :(得分:1)
您不必使用位移(尽管这可能是最有效的方法)。
对于你的12位BCD号码,如果没有任何溢出,假设b [5]到b [0]保持你的字节从最重要到最不重要,那个mod是模数(余数) operation和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的奇数幂需要棘手的位移或余数/除法码。
答案 1 :(得分:1)
通过半字节移动是最有效的方式。
如果性能不是您的问题,并且您希望拥有最易读的版本,则可能需要将BCD编号转换为字符串并移动小数点。
如果你没有小数点(例如你的数字是一个整数),如果x>你可以连续零。 0或删除最后的-x字符,如果x< 0
然后将字符串转换回BCD。注意溢出以及删除所有字符并以空字符串结尾的情况。