Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Path: utzoo!mnetor!uunet!husc6!rutgers!iuvax!pur-ee!uiucdcs!uxc.cso.uiuc.edu!uxe.cso.uiuc.edu!mcdonald From: mcdonald@uxe.cso.uiuc.edu Newsgroups: comp.lang.c Subject: Re: Printing binary (was: Re: Why colle Message-ID: <47000019@uxe.cso.uiuc.edu> Date: Fri, 23-Oct-87 12:33:00 EST Article-I.D.: uxe.47000019 Posted: Fri Oct 23 12:33:00 1987 Date-Received: Mon, 26-Oct-87 02:30:31 EST References: <235@snark.UUCP> Lines: 44 Nf-ID: #R:snark.UUCP:235:uxe.cso.uiuc.edu:47000019:000:998 Nf-From: uxe.cso.uiuc.edu!mcdonald Oct 23 11:33:00 1987 >#include "stdio.h" >void bprint(n, fp) >/* print n in binary to given fp */ >int n; >FILE *fp; >{ > static char *nybbles = > > { > "0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", > "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111", > }; > static char hexdigits = "0123456789abcdef"; > > char foobuf[BUFSIZ], *cp; /* BUFSIZ from stdio.h */ > > (void) sprintf(cp = foobuf, "%x", n); > while (*cp) > (void) fputs(nybbles[strchr(hexdigits, *cp++) - hexdigits], fp); >} Arrgh gasp complicated! perhaps (going to stdout, and for longs, but you get the idea): #include bprint(number) long number; { unsigned long mask; for (mask = ~( (~(unsigned long)1l) >> 1); mask != 0 ; mask >>= 1) putchar((((unsigned long)number & mask) != 0l) + '0'); } On paper this even works on 1's complements machines, although I haven't tried it except on 2's complement. Note that nowhere is the word size explicitly needed. Doug McDonald