Binärdarstellung
-
Hallo!
Ich habe hier ein Programm, das eine Zahl in Binärdarstellung anzeigt.
#include <stdio.h> int main (void) { int zahl; int i; printf ("Zahl : "); scanf("%d",&zahl); printf("\nbin\"ar: "); for(i=(sizeof(zahl) * 8) - 1; i >= 0;i--) { printf("%d",(zahl & (0x01 << i)) > 0); } printf ("\n"); return 0; }
Ich habe jetzt folgende Probleme:
-Ich würde das ganze gerne als Funktion schreiben aber ich bräuchte dafür ein paar Tipps von euch
-Die Binärdarstellung soll in Nibbles angezeigt werden und zudem nur die signifikanten Stellen ausgegeben werden z.B.: 278 = 1 0001 0110
-Das ganze soll in einer Endlosschleife umgesetzt werden und hierbei weiß ich nicht was gemeint ist.
Ich wäre sehr dankbar wenn ihr mir etwas weiterhelfen könntet
-
Laufe in der Schleife vom kleinsten zum größten Bit, bastele dir das in einem String zusammen und gibt diesen dann umgekehrt aus.
Füge nach 4 Rechnungen ein Leerzeichen ' ' in den String.
-
Danke Wutz für den Tipp aber ich hab das mit dem Code noch nicht hinbekommen. Ich habe den Code jetzt erstmal etwas vereinfacht:
#include <stdio.h> int main() { int a, b[31]; printf ("\nEingabe der Zahl: "); scanf ("%d", &a); for (int i = 0, c = a;i<=30;i++) { b[i] = c % 2; c >>= 1; } for(int i = 30; i >= 0; --i) if(b[i]<0) { b[i] = b[i] * -1; } for(int i = 30; i >= 0; --i) printf ("%d", b[i]); printf (" in binär.\n"); }
Das habe ich jetzt versucht als Funktion darzustellen:
int binary (int n){ int b[31]; for (int i = 0, c = n;i<=30;i++) { b[i] = c % 2; c >>= 1; } for(int i = 30; i >= 0; --i) if(b[i]<0) { b[i] = b[i] * -1; } for(int i = 30; i >= 0; --i) return b[i]; } int main (){ int x; printf("Zahl eingeben:"); scanf("%i",&x); printf("Ergebnis:%i",binary(x)); }
Ist die Funktion an sich richtig?
Bei der Ausgabe am Ende stimmt noch was nicht, da ich ja mehrere Werte rausbekomme. Muss ich dann x auch als dynamischen Array festlegen oder funktioniert die Ausgabe mit einer for-schleife?
-
Dynamische Arrays brauchst du nicht.
Du kannst den Puffer für die binäre Darstellung ja vorher festlegen.
Z.B.char buf [ sizeof ( int ) * CHAR_BIT + 1 ] = { 0 };
void int2bin ( int a, char* buf ) { int i, bits = sizeof ( a ) * CHAR_BIT; for ( i = 0; i < bits; i++ ) buf [ i ] = ( a >> bits - i - 1 & 1 ) + '0'; } int main() { int x = 548; char buf [ sizeof ( x ) * CHAR_BIT + 1 ] = { 0 }; int2bin ( x, buf ); puts(buf); getchar(); return 0; }
Für die Ausgabe in Nibbles kannst du ja ein extra Schleifchen nehmen.
-
CJosef schrieb:
Für die Ausgabe in Nibbles kannst du ja ein extra Schleifchen nehmen.
kannst du mir ein beispiel zeigen?
-
nibbl schrieb:
kannst du mir ein beispiel zeigen?
Hier habe ich Dir ein einfaches Beispiel ohne Schnickschnack:
#include <stdio.h> void bin (int zahl) { int i; unsigned long maske = (1<<31); char leading_zero = 1; for (i=1; i<=32; ++i) { if ( (zahl & maske) != 0 ) { printf ("1"); leading_zero = 0; } else if ( leading_zero == 0 ) { printf ("0"); } if ( (leading_zero == 0) && (i%4 == 0) ) { printf (" "); } maske >>=1; } } int main (void) { int zahl; while (1) { zahl = 0; printf ("Zahl (0=Ende): "); fflush (stdin); // definiert für Microsoft-VC und MSVCRT.DLL (MingW-GCC)! scanf ("%d",&zahl); if (zahl == 0) break; printf ("\nbinaer: "); bin (zahl); printf ("\n\n"); } return 0; }
Beachte die Endlosschleife in main: while(1) bricht nie ab, außer wenn irgendwie ein "break" passiert.
In Windows klappt**
fflush(stdin)
**wie gewünscht. Wenn Du in Linux programmierst, musst Du zum Leeren des Eingabepuffers etwas anderes anwenden (http://www.c-plusplus.net/forum/39349).viele grüße
ralph
-
nibbl schrieb:
CJosef schrieb:
Für die Ausgabe in Nibbles kannst du ja ein extra Schleifchen nehmen.
kannst du mir ein beispiel zeigen?
Wo ist das Problem, wie man den Inhalt eines Arrays anzeigt?
Das steht ganz am Anfang deines C-Buchs/Tutorials.Ein Array braucht man ja auch gar nicht:
/* 4 == j ? j = 0 : 0; macht das selbe wie if ( 4 == j ) j = 0; */ void nibbled_intview ( int a ) { // j: sorgt fürs Nibbeln int i, j = 0, bits = sizeof ( a ) * CHAR_BIT; for ( i = bits -1; !( a >> i & 1 ) && i >= 4; i--, j++ ) // Mit dem i-Zähler zum MSB durchhangeln, oder zum Anfang des letzten Nibbles. 4 == j ? j = 0 : 0; 4 == j ? j = 0 : 0; // eine linksbündige Ausrichtung ist erwünscht for ( ; i >= 0; i--, j++ ) 4 == j ? putchar (' '), j = 0 : 0, printf ( "%d", a >> i & 1 ); } void intview ( int a ) { int i, bits = sizeof ( a ) * CHAR_BIT; for ( i = bits -1; i >= 0; i-- ) printf ( "%d", a >> i & 1 ); } int main ( void ) { int x = 4711; intview ( x ); putchar ( '\n' ); nibbled_intview ( x ); return 0; }
-
#include <limits.h> #include <stdio.h> #define INT_BITS CHAR_BIT*sizeof(int) char* toBin(int m){ int i; static char bin[INT_BITS+1]; for(i = INT_BITS; i; --i) bin[INT_BITS-i] = '0' + ((m >> (i-1)) & 1u); return bin; } int main(){ int m; puts("Eingabe der Zahl"); if(scanf("%d", &m) == 1){ while(getchar() != '\n'); puts(toBin(m)); } getchar(); return 0; }
-
Vorsicht die nachfolgende Lösung könnte nach Meinung eines Gurus dieser Community schädlich für Ihre Gesundheit sein. Lesen Sie bei entsprechenden Anzeichen nicht weiter.
#include <stdio.h> #include <stdlib.h> /*inkludiert unter Anderem limits.h*/ #define DATENTYP long long /*Durch Klammern von (x) wird ein uebergebener Ausdruck zuerst ausgewertet*/ #define zeigeBit(x) ((x)!=0)?fprintf_s(stdout,"1"):fprintf_s(stdout,"0") const void zeigeByte(DATENTYP cZ) { unsigned char nI; for (nI=sizeof(cZ)*CHAR_BIT;nI>0;nI--) { /*sizeof liefert Bytezahl*/ if (nI%4==0) fprintf_s(stdout," "); /*mit Luecken ist die Zahl besser lesbar*/ zeigeBit(cZ&(0x1i64<<(nI-1))); /*Postfix i64 auch fuer long long*/ } /*for*/ fprintf_s(stdout,"\n"); } /*zeigeByte*/
Dieser Lösungsvorschlag erlaubt die binäre Darstellung einer Ganzzahl in Vierergruppen (Halbbyte, Nibbel). Einfach Zeile 4 auf einen anderen Type wie char, short, int, long, long long umstellen.
Da viele Kompiler eine Konstante wie 0x1 als int behandeln, muss fuer long long das Postfix i64 angehängt werden.
Das Makro in Zeile 7 macht einerseits das Programm etwas übersichtlicher. Kann aber besonders zu den erwähnten Gesundheitsschäden führen.
Hinweise zum Programmierstil:
Ich benutze Variablennamen in (gemäßigter) ungarischen Notation:
c char
n numerisch (egal welcher Typ)Ich benutze immer die Dateifunktionen fprintf und fscanf, um den Datenstrom insbesondere auf stdout oder stderr leiten zu können.
Ich benutze immer die sicheren Funktionen fprintf_s und fscanf_s. Schließlich sind sie dafür in C eingeführt worden.
Ich schreibe an alle schließenden geschweiften Klammern immer den Namen des Konstrukts.
Ich schreibe öffnende Klammern auf die gleiche Zeile wie das Konstrukt.