私は大きな(12桁の)BCD番号を持っており、6バイトの配列にエンコードされています-各ニブルは1つのBCD桁です。10 ^ xを掛ける必要があります。ここで、xは正または負になります。
ビットではなくニブルで左または右にシフトすることで実行できることは知っていますが、これは恐ろしい実装です。特に、私が使用しているJavacardではそうです。もっと良い方法はありますか?
私は大きな(12桁の)BCD番号を持っており、6バイトの配列にエンコードされています-各ニブルは1つのBCD桁です。10 ^ xを掛ける必要があります。ここで、xは正または負になります。
ビットではなくニブルで左または右にシフトすることで実行できることは知っていますが、これは恐ろしい実装です。特に、私が使用しているJavacardではそうです。もっと良い方法はありますか?
ビットシフトを使用する必要はありません(ただし、これがおそらく最も効率的な方法です)。
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の偶数乗はバイトの単純なコピーです(2つのニブルは1バイトであるため)が、10の奇数の累乗のみがトリッキーなビットシフトまたは剰余/除算コードを必要とします。
ニブルによるシフトが最も効率的な方法です。
パフォーマンスに問題がなく、最も読みやすいバージョンが必要な場合は、BCD番号を文字列に変換し、小数点を移動することをお勧めします。
小数点がない場合(たとえば、数値が整数の場合)、x> 0の場合はゼロを連結し、x<0の場合は最後の-x文字を削除できます。
その後、文字列をBCDに変換し直します。オーバーフローや、すべての文字を削除して空の文字列になってしまう場合に注意してください。