Как мне умножить (и разделить) числа BCD на 10 ^ x - PullRequest
0 голосов
/ 05 января 2009

У меня есть большой (12-значный) номер BCD, закодированный в массив из 6 байтов - каждый кусочек - это одна BCD-цифра. Мне нужно умножить его на 10 ^ x, где x может быть положительным или отрицательным.

Я знаю, что это может быть сделано путем сдвига влево или вправо по клеву вместо бит, но это ужасная реализация - особенно в Javacard, который я и использую. Есть ли способ лучше?

Ответы [ 2 ]

1 голос
/ 05 января 2009

Сдвиг по клевам - самый эффективный способ.

Если производительность не является вашей проблемой, и вы хотите иметь наиболее читаемую версию, вы можете преобразовать свой BCD-номер в строку и переместить десятичную точку вокруг.

Если у вас нет десятичной точки (например, ваш номер является целым числом), вы можете объединить нули, если x> 0, или удалить последние символы -x, если x <0. </p>

Затем преобразовать строку обратно в BCD. Остерегайтесь переполнений и случаев, когда вы удаляете все символы и в итоге получаете пустую строку.

1 голос
/ 05 января 2009

Вам не нужно использовать сдвиг битов (хотя это, вероятно, самый эффективный способ сделать это).

Для вашего 12-значного числа BCD, при условии, что переполнения не будет, предположим, что от b [5] до b [0] содержит ваши байты от старшего к младшему, а этот модуль является модулем (остаток) Операция, а 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.

Любая четная степень десяти является простой копией байтов (поскольку два nybbles - это байт), в то время как только нечетные степени десяти потребуют хитрого кода сдвига или остатка / деления.

...