Drucken Sie ein int in binärer Darstellung mit C
Ich bin auf der Suche nach einer Funktion, mir zu erlauben, drucken Sie die binäre Darstellung eines int. Was ich habe, so weit ist;
char *int2bin(int a)
{
char *str,*tmp;
int cnt = 31;
str = (char *) malloc(33); /*32 + 1 , because its a 32 bit bin number*/
tmp = str;
while ( cnt > -1 ){
str[cnt]= '0';
cnt --;
}
cnt = 31;
while (a > 0){
if (a%2==1){
str[cnt] = '1';
}
cnt--;
a = a/2 ;
}
return tmp;
}
Aber wenn ich Anrufe,
printf("a %s",int2bin(aMask)) //aMask = 0xFF000000
Bekomme ich eine Ausgabe wie;
0000000000000000000000000000000000xtpyy (Und ein paar unbekannte Zeichen.
Ist es ein Fehler in der Funktion oder bin ich Druck die Adresse des Zeichen-array, oder was? Sorry, ich kann einfach nicht sehen, wohin ich gehe falsch.
NB code ist aus hier
EDIT: Es ist keine Hausaufgabe zur info, ich bin versucht zu Debuggen jemand anderes image manipulation Routinen in einer unbekannten Sprache. Wenn jedoch es wurde getaggt als Hausaufgabe, weil es ein elementares Konzept dann fair play.
InformationsquelleAutor der Frage gav | 2009-06-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist eine weitere option, die mehr optimiert, wo Sie passieren, in Ihrem zugewiesenen Puffer übergeben wird. Stellen Sie sicher, dass es die richtige Größe hat.
InformationsquelleAutor der Antwort Adam Markowitz
Ein paar Vorschläge:
malloc()
malloc()
Hier der code:
InformationsquelleAutor der Antwort Christoph
Dein string nicht null-terminiert ist. Stellen Sie sicher, fügen Sie eine
'\0'
- Zeichen am Ende der Zeichenfolge; oder man kann reservieren, es mitcalloc
stattmalloc
die null, der Speicher, der zu Ihnen zurückgegeben.Durch die Art und Weise, es gibt andere Probleme mit diesem code:
free()
ing der zugewiesenen string. Sie werden Speicherverlust, wenn Sie nur nennen Sie es in einemprintf
nennen.Hier ist eine alternative Implementierung, die Sie verwenden konnten.
Verwendung:
Der zweite parameter ist ein Zeiger auf einen Puffer, die Sie möchten, speichern Sie die Ergebnis-string. Wenn Sie nicht über einen Puffer übergeben werden können
NULL
undint2bin
schreiben Sie einestatic
Puffer und zurück, um Sie. Der Vorteil dieser gegenüber der ursprünglichen Implementierung ist, dass der Anrufer keine sorgen überfree()
ing der Zeichenfolge, die zurückgegeben wird.Ein Nachteil ist, dass es nur eine statische Puffer auf, so dass nachfolgende Aufrufe überschrieben werden, die die Ergebnisse von früheren anrufen. Sie konnte nicht speichern Sie die Ergebnisse mehrerer Aufrufe für die spätere Verwendung. Auch, es ist nicht threadsicher, das heißt, wenn Sie rufen Sie die Funktion auf diese Weise aus verschiedenen threads konnte Sie Klamotten des jeweils anderen strings. Wenn das ist eine Möglichkeit, Sie müssen pass, die in Ihre eigenen Puffer, anstatt die
NULL
:InformationsquelleAutor der Antwort John Kugelman
Hier ist ein einfacher Algorithmus.
InformationsquelleAutor der Antwort Luqman_Ahmad
dies ist, was ich aus der Anzeige einer interger als binairy code getrennt je 4 bits:
könnte es ein bisschen groß, aber ich Schreibe immer einen Weg (hoffe ich), dass jeder verstehen kann, was Los ist. hoffe, das half.
InformationsquelleAutor der Antwort Kirito
InformationsquelleAutor der Antwort amol
Zwei Dinge:
'\0'
eingestellt ist.while (a > 0)
wird sofort falsch.Beiseite: Die malloc-Funktion ist innen hässlich. Was über die Bereitstellung einen Puffer, um int2bin?
InformationsquelleAutor der Antwort Markus Schnell
Ein paar Dinge:
vielleicht ist diese Idee oben können Sie sofort loslegen.
das ganze char array auf 0?
array nach dem Funktionsaufruf!
InformationsquelleAutor der Antwort merkuro
Zwei einfache Versionen kodiert hier (reproduziert mit milden Neuformatierung).
InformationsquelleAutor der Antwort nik
gehören
int main(void) {
}
InformationsquelleAutor der Antwort Anil Kumar
//Dies ist, was ich getan habe, als unser Lehrer fragte uns, dies zu tun
InformationsquelleAutor der Antwort Ioannis Vogiatzis
der einfachste Weg für mich, dies zu tun (für eine 8-bit-Darstellung):
InformationsquelleAutor der Antwort KoSv
Hier ist eine andere Lösung, die nicht erfordert ein char *.
Oder hier für mehr Lesbarkeit:
Und hier ist die Ausgabe:
InformationsquelleAutor der Antwort Sequoya
InformationsquelleAutor der Antwort aldo núñez
Nicht so elegant, aber erreicht Ihr Ziel und es ist sehr leicht zu verstehen:
InformationsquelleAutor der Antwort Michelangelo Machado
Hier ist meine Lösung. Es erstellt eine Maske, beginnend mit all-0 ' s und eine 1 in das bit ganz Links, und logischerweise verschiebt es das richtige für jedes bit in der angenommen 32-bit-Ganzzahl. Die bits werden nacheinander gedruckt durch den Umbau der Wert des momentan maskierten ganze Zahl in einen booleschen Wert.
InformationsquelleAutor der Antwort Rosemary Fortanely
InformationsquelleAutor der Antwort sean