реклама на сайте
подробности

 
 
> Разделение числа на разряды, динамическая индикация
Abell
сообщение Dec 19 2006, 13:43
Сообщение #1


профессиональный дилетант
****

Группа: Участник
Сообщений: 866
Регистрация: 16-03-06
Из: Шебекино - Лысьва - Тюмень
Пользователь №: 15 292



Подскажите, плз, какие алгоритмы вообще существуют для разделения числа на разряды? есть задача, требуется отобразить измеренное значение на семисегментном динамическом дисплее. создал массив по количеству разрядов, в цикле делю исходное число на 10 без остатка, обратно умножаю на 10 и вычитаю из исходного. так все получается, но, может, есть более простые/быстрые пути?


--------------------
Скоро дело сказывается, да не скоро сказка делается, или тише будешь - дальше уедешь...

Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
umup
сообщение Jan 12 2007, 15:34
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 226
Регистрация: 2-06-06
Пользователь №: 17 720



Есть на С (метод сдвига и десятичной коррекции, возможно,самый быстрый для BCD преобразования).
Описание метода - в книге Титце,Шенк Полупроводниковая схемотехника, стр.320 (http://www.cqham.ru/lib.htm)

Функция bin2bcd32 - преобразование binary -> packed bcd (num_bytes - количество байтов на выходе)

Код
uint32_t bin2bcd32(uint32_t num, uint8_t num_bytes) /**< \brief Convert uint32_t num to packed BCD using num_bytes of number - universal \ingroup ul_math */
{uint32_t ul1=0; /*result*/
uint8_t uc1;
for (uc1=(4-num_bytes);uc1;uc1--) num<<=8; /*adjust input bytes*/
for (uc1=(num_bytes<<3);uc1;uc1--) /*bit shift loop*/
{uint8_t uc2,uc3;
  /*BCD nibbles correction*/
  ul1+=0x33333333;
  for (uc3=4;uc3;uc3--)
  {uc2=(uint8_t)(ul1>>24);
   if (!(uc2&0x08)) uc2-=0x03;
   if (!(uc2&0x80)) uc2-=0x30;
   ul1=ul1<<8; ul1|=uc2;
  }
  /*shift next bit of input and result*/
  ul1<<=1;
  if ((num>>24)&0x80) ul1|=1;
  num<<=1;
}
return(ul1);
}


Сообщение отредактировал umup - Jan 12 2007, 15:47
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 29th July 2025 - 16:13
Рейтинг@Mail.ru


Страница сгенерированна за 0.01376 секунд с 7
ELECTRONIX ©2004-2016