Code: Select all
uint32_t a;
uint8_t b;
uint32_t result = (a+(b>>1))/b;
У меня вот сейчас стоит выбор оставь деление с округлением на асме либо делать вместо 16 битного деление 32-х, но тогда проще сделать 2 деления по 16 бит.
Code: Select all
uint32_t a;
uint8_t b;
uint32_t result = (a+(b>>1))/b;
Code: Select all
uint32_t result = (uint32_t)(a+(b>>1))/b;
Либо я плохо спросил, либо я не понимаю разницы.Yurii wrote:напишите явное преобразование в 32 бита.Code: Select all
uint32_t result = (uint32_t)(a+(b>>1))/b;
Code: Select all
uint32_t result = a / b;
uint32_t rem = a % b;
if (rem > (b>>1)) result++;
Это легко проверить - Если Протеус у Вас установлен, то делаете два варианта, ставите брэйкпоинты и увидите время при отладке кода по шагам. Если оптимизатор не позволит их поставить, измеряемый код обрамите volatile командами, типа ногодрыга портов и смотрите время между ними. Также можно измерять время между фронтами виртуальным осциллографом, но менее точно.KOT wrote: т.е этот код возможно будет быстрей