Вот более быстроработающий вариант без операций деления/умножения (однако, выводит только 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;
}