Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

деление на 5 для 8- и 16-битов с использованием и без использования апп.умножения

Отправлено ыфефт 29 мая 2007 г. 13:00
В ответ на: Деление на 3, 5, 7 - вроде пробегал сдесь хитрый способ быстрого целочисленного деления? Подскажите плз.) отправлено <font color=gray>делитель</font> 29 мая 2007 г. 11:50

Подробно описано в Hackers delight. Число умножается на константу вида (2^16 / K) (для 8-битного числа), (2^32 / K) (для 16-битного числа) и сдвигается вправо на 8/16 битов, K - заданный делитель.


//Division by constants//////////////////////////////////////////////////////////////////////////////////////////////////////////////////


/** \brief unsigned 8-bit division by 5 (using shifts)
äåëåíèå áåççíàêîâîãî 8-áèòíîãî ÷èñëà íà 5 (åñëè íåò àïïàðàòíîãî óìíîæåíèÿ) \ingroup group_math */
u8 div_by5_u8_soft(u8 data_in)
{u16 u16_01, result;
result = u16_01 = data_in;
u16_01 <<= 1;
result += u16_01;
u16_01 <<= 1; u16_01 <<= 1; u16_01 <<= 1;
result += u16_01;
u16_01 <<= 1;
result += u16_01;
result += 51;
return(result >> 8);
}

/** \brief unsigned 8-bit division by 5 (using multiply)
äåëåíèå áåççíàêîâîãî 8-áèòíîãî ÷èñëà íà 5 (åñëè åñòü àïïàðàòíîå óìíîæåíèå) \ingroup group_math */
u8 div_by5_u8_hmul(u8 data_in)
{return((((u16)data_in * 0x33) + 0x33) >> 8);
}

/** \brief unsigned 16-bit division by 5 (using shifts)
äåëåíèå áåççíàêîâîãî 16-áèòíîãî ÷èñëà íà 5 (åñëè íåò àïïàðàòíîãî óìíîæåíèÿ) \ingroup group_math */
u16 div_by5_u16_soft(u16 data_in)
{u32 u32_01, result;
result = u32_01 = data_in;
u32_01 <<= 1; result += u32_01;
u32_01 <<= 3; result += u32_01;
u32_01 <<= 1; result += u32_01;
u32_01 <<= 3; result += u32_01;
u32_01 <<= 1; result += u32_01;
u32_01 <<= 3; result += u32_01;
u32_01 <<= 1; result += u32_01;
result += 0x3333;
return(result >> 16);
}

/** \brief unsigned 16-bit division by 5 (using multiply) \ingroup group_math */
u16 div_by5_u16_hmul(u16 data_in)
{return((((u32)data_in * 0x3333) + 0x3333) >> 16);
}




Составить ответ | Вернуться на конференцию

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
введите число 47:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru