Вам не нужно использовать сдвиг битов (хотя это, вероятно, самый эффективный способ сделать это).
Для вашего 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 - это байт), в то время как только нечетные степени десяти потребуют хитрого кода сдвига или остатка / деления.