Я сдвигаю биты числа BCD влево или вправо, чтобы быстро умножить или разделить на 2. Вот быстрый пример сдвига влево:
void LShift(unsigned char *arg)
{
int i, carry=0, temp;
for(i=2;i>=0;i--)
{
temp=(arg[i]<<1)+carry;
if (temp>9) temp+=6;
carry=temp>>4;
arg[i]=temp&0xF;
}
}
Это прекрасно работает, и если вы дадите ему массив типа {4,5,6}
, он вернет {9,1,2}.
Проблема в том, что если я хочу сдвинуться более чем на один бит, мне придется вызывать функцию снова и снова. Есть ли какой-нибудь умный способ сдвига более чем на один бит за раз без предварительного преобразования числа BCD в десятичное?
{9,1,2}
в качестве входных данных? Вам нужна дополнительная цифра (байт) вывода? Обобщая, вам, возможно, потребуется много дополнительных байтов для выходного значения для сдвигов больше 1. Вы можете обобщить интерфейс:size_t BCD_LShift(unsigned char *value, size_t vallen, size_t lshift, unsigned char *result, size_t reslen);
где возвращаемое значение — это количество цифр BCD в результате. Интересно, где находится точка останова между повторным вызовом функции и «преобразовать в двоичное целое, сдвинуть, преобразовать в BCD»? - person Jonathan Leffler   schedule 23.07.2013