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