Dezimal nach Binär umrechnen Problem
-
Moin Leute,
Hab ein kleines Problem mein Programm zum Umrechnen von Dezimal auf Binär funktioniert nicht. Das Programm startet zwar aber bei der Ausgabe wird nur 0 ausgegeben.
#include <iostream.h> #include <stdlib.h> int Binaerzahl[7]; void DezToBin(int); void Arrayleeren(void); int main() { int Dezimalzahl; Arrayleeren(); // Setzt das Array auf den Anfangswert 0.0 cout << endl << "Dezimal in Binaerzahl umrechnen."; cout << endl << "Geben Sie einen Dezimalwert von 0 bis 255 ein: "; cin >> Dezimalzahl; // Eingabe der Dezimalzahl bis 255 begrenzt DezToBin(Dezimalzahl); // Aufruf der Funktion zum Umwandeln system("PAUSE"); return 0; } void DezToBin(int A) { if((A > 256) && (A<=128)) // Für Wert 128 { Binaerzahl[0] = 1; A = A - 128; } if((A > 128) && (A <=64)) //64 { Binaerzahl[1] = 1; A = A - 64; } if((A > 64) && (A <= 32)) //32 { Binaerzahl[2] = 1; A = A - 32; } if((A > 32) && (A <= 16)) //16 { Binaerzahl[3] = 1; A = A - 16; } if((A > 16) && (A <= 8)) //8 { Binaerzahl[4] = 1; A = A - 8; } if((A > 8) && (A <= 4)) //4 { Binaerzahl[5] = 1; A = A - 4; } if((A > 4) && (A <= 2)) //2 { Binaerzahl[6] = 1; A = A - 2; } if((A > 2) && (A <= 1)) //1 { Binaerzahl[7] = 1; A = A - 1; } cout << endl; // Ausgabe auf den Bildschrim for(int i = 0; i <= 7; i++) { cout << Binaerzahl[i]; } cout << endl; return; } void Arrayleeren(void) { for(int i = 0; i<=7;i++) { Binaerzahl[i] = 0; } return; }
Ich weiß nicht warum die Funktion falsch ist, ist doch logisch geschrieben.
Danke im Voraus für Antworten.
Greetz Hami85
-
Schau dir doch mal deine if-Abfragen genau an:
Welche Zahl kann denn größer 256 und kleiner-gleich 128 zugleich sein??
-
Außerdem ist der Code ziemlich umständlich. Viel einfacher ist die Funktion doch so:
void DezToBin(int A) { for(int i=0; i<8; i++) { if(A%2 != 0) Binaerzahl[i] = 1; A = A >> 1; } cout << endl; // Ausgabe auf den Bildschrim for(i = 0; i <= 7; i++) { cout << Binaerzahl[i]; } cout << endl; }
Void-Funktionen müssen auch kein 'return' am Ende haben.
-
DarthZiu schrieb:
Viel einfacher ist die Funktion doch so:
mag ja sein aber wieso schiebst du immer 'cout' um 'endl' stellen nach links?
-
@net:
Der war nicht gut, ausgerechnet der Block ist 1:1 vom Originalprogramm kopiert :p
-
Hoppla, die If-Anweisungen
ja klar dann funktz auch
Danke Leute
Greetz Hami85
-
Tja, und wenn ich diesen Code im C++-Forum posten würde, käme bestimmt einer, der fragt, warum ich versuche die Zuweisung 'A = A' in den Stream '1' zu schreiben ...
(Außerdem versuche ich ebenfalls cout um Binaerzahl[i] Stellen nach links zu verschieben!)
-
LordJaxom schrieb:
@net:
Der war nicht gut, ausgerechnet der Block ist 1:1 vom Originalprogramm kopiert :pna gut, aber da ich ja immer was zu meckern habe: für das 'if(A%2 != 0)' sollte man besser 'if (A & 1)' schreiben. das ist um ein vielfaches schneller...
-
Waere es nicht noch schneller, auf das if ganz zu verzichten und gleich
Binaerzahl[i] = A&1;
zu schreiben?
-
tim_g schrieb:
Waere es nicht noch schneller, auf das if ganz zu verzichten und gleich
Binaerzahl[i] = A&1;
zu schreiben?
kann man schwer sagen, schliesslich schreibste ja dann auch noch die nullen rein. müsste man mal ausprobieren...
-
Und wenn man die Funktion zweimal benutzt kommt Müll raus, wenn das Array nicht reinitialisiert wird. Also wenn dann schon auch die Nullen reinschreiben.
Ausserdem hat der OP offensichtlich noch kleinere Probleme mit Array bzw. dem Zugriff auf selbige (siehe den Bufferoverflow Binaerzahl[7] = 1;)
Aber wozu überhaupt irgendwas in das Array reinschreiben, wenn man es eh bloss ausgeben will?
-
TactX schrieb:
Aber wozu überhaupt irgendwas in das Array reinschreiben, wenn man es eh bloss ausgeben will?
dann braucht er vielleicht sowas:
void print_binary (int v) { int z; if (z = v>>1) print_binary (z); putchar ('0' + v - (z<<1)); }
-
Naja, das geht mächtig in die Hose wenn v negativ ist, und der Compiler arithmetisch shiftet.
Und Rekursion geht ja schonmal gar nicht
-
TactX schrieb:
Naja, das geht mächtig in die Hose wenn v negativ ist, und der Compiler arithmetisch shiftet.
dann machste eben 'unsigned' vor alles...
TactX schrieb:
Und Rekursion geht ja schonmal gar nicht
ach, die paar bytes stack. pc-programme haben doch immer 1mb oder so
dafür wird's in der richtigen reihenfolge ausgegeben
-
Hab hier auch mal ne Lösung um eine Zahl in Binärdarstellung ausgeben zu lassen (sieht dem von net ein wenig ähnlich):
void print_bin(unsigned int zahl) { unsigned int i=sizeof(int)*8; while(i-- != 0) printf("%1u", ((zahl >> i) & 1)); }