Швидке та просте рішення:
void printbits(my_integer_type x)
{
for(int i=sizeof(x)<<3; i; i--)
putchar('0'+((x>>(i-1))&1));
}
Працює для будь-якого типу розміру та для підписаних та неподписаних вкладок. '& 1' потрібен для обробки підписаних вводів, оскільки зсув може робити розширення знаків.
Існує так багато способів зробити це. Ось надзвичайно простий варіант для друку 32 біт або n бітів із підписаного або непідписаного 32-бітного типу (не ставити мінус, якщо він підписаний, просто надрукувати фактичні біти) і не повернути каретку. Зауважте, що i зменшується до зсуву біт:
#define printbits_n(x,n) for (int i=n;i;i--,putchar('0'|(x>>i)&1))
#define printbits_32(x) printbits_n(x,32)
Що з поверненням рядка з бітами для зберігання чи друку пізніше? Ви можете виділити пам'ять і повернути її, і користувач повинен її звільнити, або ж ви повернете статичну рядок, але вона буде розблокована, якщо вона буде викликана ще раз, або іншим потоком. Показані обидва способи:
char *int_to_bitstring_alloc(int x, int count)
{
count = count<1 ? sizeof(x)*8 : count;
char *pstr = malloc(count+1);
for(int i = 0; i<count; i++)
pstr[i] = '0' | ((x>>(count-1-i))&1);
pstr[count]=0;
return pstr;
}
#define BITSIZEOF(x) (sizeof(x)*8)
char *int_to_bitstring_static(int x, int count)
{
static char bitbuf[BITSIZEOF(x)+1];
count = (count<1 || count>BITSIZEOF(x)) ? BITSIZEOF(x) : count;
for(int i = 0; i<count; i++)
bitbuf[i] = '0' | ((x>>(count-1-i))&1);
bitbuf[count]=0;
return bitbuf;
}
Телефонуйте за допомогою:
// memory allocated string returned which needs to be freed
char *pstr = int_to_bitstring_alloc(0x97e50ae6, 17);
printf("bits = 0b%s\n", pstr);
free(pstr);
// no free needed but you need to copy the string to save it somewhere else
char *pstr2 = int_to_bitstring_static(0x97e50ae6, 17);
printf("bits = 0b%s\n", pstr2);