Mai mult
Există un printf converter pentru a imprima în format binar?
Pot imprima cu printf un hex sau număr octal. Există un format de etichetă pentru a imprima ca un binar, sau arbitrare de bază?
Sunt de funcționare gcc.
printf("%d %x %o\n", 10, 10, 10); //prints "10 A 12\n"
print("%b\n", 10); // prints "%b\n"
400
48
Hacky, dar funcționează pentru mine:
Pentru multi-octet tipuri
Ai nevoie de tot suplimentare citate din păcate. Această abordare are o eficiență riscurile de macro-uri (don't trece o funcție ca argument pentru
BYTE_TO_BINARY
), dar evită probleme de memorie și mai multe invocații de strcat în unele dintre celelalte propuneri aici.Print Binar pentru Orice tip de Date
test
Aici este un hack rapid pentru a demonstra tehnici de a face ceea ce vrei.
Nu e't un binar specificator de conversie în glibc în mod normal.
Este posibil să adăugați personalizat tipuri de conversie la printf() familia de funcții în glibc. A se vedea registrul de_printf_function pentru detalii. Ai putea adăuga un custom %b conversie pentru uz propriu, dacă se simplifică aplicarea codului să îl ai la dispoziție.
Aici este o de exemplu de cum să pună în aplicare un obicei printf formate în glibc.
Ai putea folosi o masă mică pentru a îmbunătăți viteza de1. Tehnici similare sunt utile în lumea încorporat, de exemplu, pentru a inversa un octet:
1 I'm cea mai mare parte referindu-se la aplicații embedded unde optimizatori nu sunt atât de agresive și diferența de viteză este vizibil.
Imprimare bitul cel mai puțin semnificativ și trecerea pe dreapta. Face acest lucru până când întreg devine zero imprimă reprezentarea binară fără zerouri la început, dar în ordine inversă. Folosind recursivitate, ordinea poate fi corectată destul de ușor.
Pentru mine, aceasta este una dintre cele mai curate soluții la această problemă. Dacă vă place
0b
prefix și un sfârșit de linie nouă de caractere, vă sugerez ambalaj funcția.Demo on-line
Bazat pe @William Whyte's a răspunde, acesta este un macro care oferă
int8
,16
,32
&64
versiuni, reutilizareaINT8
macro pentru a evita repetarea.Acest ieșiri:
Pentru lizibilitate, poate doriți să adăugați un separator de exemplu:
Aici's o versiune de funcția care nu suferă de reentrancy probleme sau limite privind dimensiunea/tipul de argument:
Rețineți că acest cod ar lucra la fel de bine pentru orice bază între 2 și 10 dacă înlocuiți doar 2's de baza dorită. Utilizare este:
Unde " x " este orice expresie integrantă.
Nici unul dintre postat anterior răspunsurile sunt exact ceea ce căutam, așa că am scris-o. Este super simplu de utilizat %B cu "printf"!
Unele runtime suport "%b" deși nu este un standard.
De asemenea, a se vedea aici pentru o discuție interesantă:
http://bytes.com/forum/thread591027.html
HTH
Anii
printf()
familia este doar capabil de a imprima în baza 8, 10 și 16 folosind standard de proiectanti direct. Am sugerăm să creați o funcție care convertește un număr într-un șir pe cod's nevoile specifice.Pentru a imprima în orice bază [2-36]
Toate celelalte răspunsuri de până acum au cel puțin una din aceste limite.
Utilizare memorie statică pentru a reveni tampon. Acest lucru limitează numărul de ori funcția poate fi folosit ca un argument pentru
printf()
.Aloca memorie care necesită codul de asteptare pentru indicii gratuit.
Necesita asteptare cod să prevadă în mod explicit o soluție tampon corespunzătoare.
Suna printf()
direct. Acest lucru impune o nouă funcție pentru a
fprintf(),
sprintf(),
vsprintf()`, etc.Utilizarea redusă întreg intervalul.
Următoarele a nici unul dintre cele de mai sus limitare. Ea are nevoie de C99 sau mai târziu, și de a folosi de
"%s"
. Se folosește o compound literal pentru a oferi spațiu tampon. Nu are probleme cu mai multe apeluri într-oprintf()
.Acest cod ar trebui să se ocupe de nevoile tale de până la 64 de biți. Am creat 2 funcții pBin & pBinFill. Ambele fac acelasi lucru, dar pBinFill umple în cele mai importante spații cu fillChar. Funcția de testare generează niște date de test, apoi imprimă folosind funcția.
Poate un pic OT, dar dacă aveți nevoie de acest lucru numai pentru debuging să înțeleagă sau reconstitui unele operații binare faci, ai putea să te uiți pe wcalc (o simpla consola de calculator). Cu -b opțiuni veți obține binar de ieșire.
de exemplu
Nu există nici o formatare funcție din biblioteca standard C pentru ieșire binare de genul asta. Toate format operațiuni printf familia sprijină sunt spre lizibil textul.
Următoarea funcție recursivă ar putea fi utile:
Am optimizat soluție de top pentru dimensiunea și C++-ness, si am ajuns la această soluție:
Nici un standard și portabil.
Unele implementări oferi itoa(), dar's nu va fi în mai, și are o oarecum dezgustător interfață. Dar codul este în spatele link-ul și ar trebui să te pună în aplicare propria formatare destul de ușor.
Mi-a placut codul de numele de paniq, static tampon este o idee bună. Cu toate acestea eșuează dacă doriți mai multe formate binare într-un singur printf (), deoarece se întoarce mereu același pointer și suprascrie matrice.
Aici's o C stilul drop-in care se roteste pointer pe un split-tampon.