#include <stdlib.h>
#include <stdio.h>
#include <memory.h>
#include <stdint.h>
typedef struct divmod10_t
{
uint32_t quot;
uint8_t rem;
} divmod10_t;
inline static divmod10_t divmodu10(uint32_t n)
{
divmod10_t res;
// умножаем на 0.8
res.quot = n >> 1;
res.quot += res.quot >> 1;
res.quot += res.quot >> 4;
res.quot += res.quot >> 8;
res.quot += res.quot >> 16;
uint32_t qq = res.quot;
// делим на 8
res.quot >>= 3;
// вычисляем остаток
res.rem = (uint8_t)(n - ((res.quot << 1) + (qq & ~7ul)));
// корректируем остаток и частное
if(res.rem > 9)
{
res.rem -= 10;
res.quot++;
}
return res;
}
char * utoa_fast_div(uint32_t value, char *buffer)
{
buffer += 11;
*--buffer = 0;
do
{
divmod10_t res = divmodu10(value);
*--buffer = res.rem + '0';
value = res.quot;
}
while (value != 0);
return buffer;
}
int main()
{
char buffer1[20];
char buffer2[20];
uint32_t i;
for(i = 0; i < 0xffffffff; i++)
{
char *str1 = utoa_fast_div(i, buffer1);
sprintf(buffer2, "%u", i);
if(strncmp(str1, buffer2, sizeof(buffer1)) != 0)
{
printf("AHUNG!!! %s != %s\r\n", str1, buffer2);
}
if((i & 0xfffff) == 0)
{
printf("%4.2f %\r\n", (i >> 20) / 2048.0 * 100);
}
}
return 0;
}