ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
25 апреля
79985 Топик полностью
VVB (31.01.2007 07:40, просмотров: 1) ответил Гудвин на Гм
Вот более быстроработающий вариант без операций деления/умножения (однако, выводит только 8 десятичных разрядов) 
/*
*********************************************************************************************************
* преобразование числа в строку символов
*
* Arguments   : data and pointer to string
* Notes       : Реентрабельна
*********************************************************************************************************
*/

void  MonBinToASCII (INT32S binary, INT8U *buf)
{
  union
  {
    struct
    {
      INT32U low;
      INT32U high;
    } lng;
    INT8U byte[8];
  } cdec;
  INT8U c,d;
  INT8U encountered_only_zeros=TRUE;

  if (binary==0)
  {
    *buf++ = '0';
    *buf = 0;
    return;
  }

  if (binary < 0)
  {
    *buf++ = '-';
    binary=-binary;
  }

  cdec.lng.low=binary;
  cdec.lng.high=0;

  for (c=0;c<32;c++)
  {
    for (d=4;d<7;d++)
    {
      if ((cdec.byte[d]&0x0F)>=0x05) cdec.byte[d]+=0x3;
      if ((cdec.byte[d]&0xF0)>=0x50) cdec.byte[d]+=0x30;
    }
    d=cdec.byte[3];
    cdec.lng.low<<=1;
    cdec.lng.high<<=1;
    if (d&0x80) cdec.byte[4]|=1;
  }

  for (c=15;c>=8;c--)
  {
    d=cdec.byte[c>>1];
    if ((c&1)==0) d&=0x0F;
    else
    {
      d&=0xF0;
      d>>=4;
    }
    if (d!=0) encountered_only_zeros=FALSE;
    if (encountered_only_zeros==FALSE) *buf++ = (d+'0');
  }
  *buf = 0;
}