Поскольку вы работаете только с 5 битами, почему бы не использовать справочную таблицу?Что-то вроде следующего:
/* Convert nstr to a number (decimal) and put a string representation of the
* lowest 5 bits in dest (which must be at least 6 chars long) */
void getBinStr(char *dest, const char *nstr)
{
char *lkup[32] = {
"00000", "00001", "00010", "00011", "00100", "00101", "00110", "00111",
"01000", "01001", "01010", "01011", "01100", "01101", "01110", "01111",
"10000", "10001", "10010", "10011", "10100", "10101", "10110", "10111",
"11000", "11001", "11010", "11011", "11100", "11101", "11110", "11111" };
strcpy(dest, lkup[atoi(nstr) & 0x1f]);
}
Или переключатель:
void getBinStr(char *dest, const char *nstr)
{
switch (atoi(nstr)) {
case 31: strcpy(dest,"11111"); break;
case 30: strcpy(dest,"11110"); break;
...
case 1: strcpy(dest,"00001"); break;
case 0: strcpy(dest,"00000"); break;
default: strcpy(dest,"error");
}
}
Или, если это кажется слишком длинным, может быть что-то вроде следующего:
void getBinStr(char *dest, const char *nstr)
{
unsigned x = atoi(nstr);
dest[0] = (x & 0x10) ? '1' : '0';
dest[1] = (x & 0x08) ? '1' : '0';
dest[2] = (x & 0x04) ? '1' : '0';
dest[3] = (x & 0x02) ? '1' : '0';
dest[4] = (x & 0x01) ? '1' : '0';
dest[5] = '\0';
}
Iобычно предпочитает один из первых двух, но последний может быть лучше, если по какой-то причине другие слишком велики (например, код для небольшого микроконтроллера).
Все они предполагают, что вы хотите, чтобы результат оставался дополненнымнули до 5 бит.