त्वरित और आसान समाधान:
void printbits(my_integer_type x)
{
for(int i=sizeof(x)<<3; i; i--)
putchar('0'+((x>>(i-1))&1));
}
किसी भी आकार के प्रकार के लिए और हस्ताक्षरित और अहस्ताक्षरित ints के लिए काम करता है। '' और 1 'पर हस्ताक्षर किए गए किलों को संभालने की जरूरत है क्योंकि शिफ्ट साइन एक्सटेंशन कर सकती है।
ऐसा करने के बहुत सारे तरीके हैं। यहाँ एक हस्ताक्षरित या अहस्ताक्षरित 32 बिट प्रकार (हस्ताक्षर किए बिना एक नकारात्मक डालने पर, केवल वास्तविक बिट्स को प्रिंट करना) और कोई गाड़ी वापसी से 32 बिट या एन बिट्स को प्रिंट करने के लिए एक सुपर सरल है। ध्यान दें कि मैं बिट शिफ्ट से पहले घटाया गया हूं:
#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);