Szybkie i łatwe rozwiązanie:
void printbits(my_integer_type x)
{
for(int i=sizeof(x)<<3; i; i--)
putchar('0'+((x>>(i-1))&1));
}
Działa dla dowolnego typu rozmiaru i dla podpisanych i niepodpisanych int. „& 1” jest potrzebne do obsługi podpisanych znaków wewnętrznych, ponieważ przesunięcie może powodować rozszerzenie znaku.
Jest na to wiele sposobów. Oto bardzo prosty do drukowania 32 bitów lub n bitów z 32-bitowego typu ze znakiem lub bez znaku (nie wstawianie ujemnego znaku, tylko drukowanie rzeczywistych bitów) i bez powrotu karetki. Zauważ, że i jest zmniejszane przed przesunięciem bitów:
#define printbits_n(x,n) for (int i=n;i;i--,putchar('0'|(x>>i)&1))
#define printbits_32(x) printbits_n(x,32)
Co powiesz na zwrócenie ciągu z bitami do późniejszego zapisania lub wydrukowania? Możesz albo przydzielić pamięć i zwrócić ją, a użytkownik musi ją zwolnić, albo zwróci ciąg statyczny, ale zostanie zablokowany, jeśli zostanie ponownie wywołany lub przez inny wątek. Pokazano obie metody:
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;
}
Zadzwoń z:
// 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);