Я пишу вызов функции мягкого умножения с использованием сдвига и добавления. Существующий вызов функции выглядит следующим образом:32-битное умножение через 16-битное смещение
unsigned long __mulsi3 (unsigned long a, unsigned long b) {
unsigned long answer = 0;
while(b)
{
if(b & 1) {
answer += a;
};
a <<= 1;
b >>= 1;
}
return answer;
}
Хотя мое оборудование не имеет множитель, у меня есть жесткий рычаг переключения. Переключатель способен сдвигать до 16 бит за один раз.
Если я хочу в полной мере использовать свой 16-разрядный сдвиг. Любые предложения о том, как я могу адаптировать код выше, чтобы отразить возможности моего оборудования? Данный код сдвигает только 1 бит на итерацию.
16-разрядный сдвигатель может сдвигать 32-разрядные беззнаковые длинные значения до 16 мест за раз. SizeOf (без знака в длину) == 32 бита
Итак, на вашей машине 'sizeof (unsigned long) == 4 && CHAR_BIT == 8'? Стоит оговаривать, что, поскольку я работаю в основном на 64-битном, поэтому по умолчанию для 'sizeof (unsigned long) == 8', и, вероятно, довольно много других людей. Ваш 16-разрядный коммутатор может сдвигать только 16-разрядные ('unsigned short', или это' unsigned int'?) Количества, а не 32-битные величины? Или он может сдвигать 32-разрядные значения без знака до 16 мест за раз? Или что-то другое? –
Благодарим вас за помощь в улучшении моей проблемы. Я никогда не думал об этом, пока ты это не указала. –
Я не понимал, что не был точен, пока вы не указали это. Последнее верно: 16-разрядный сдвиг может сдвигать 32-битные беззнаковые длинные значения до 16 мест за раз. Sizeof (unsigned long) == 32 бит –