Dezimal- in Binärzahl < C/C++ < Programmiersprachen < Praxis < Informatik < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 14:51 Fr 19.10.2007 | Autor: | Ines27 |
Aufgabe | Benötigt wird ein Programm, welches eine Dezimalzahl(Integer) über Eingabe bekommt, und diese als eine Binärzahl wieder ausgibt. |
So, nun habe ich die Binärzahl durch % Operation berechnet und gebe Sie aus. Die Zahl steht aber noch in der falschen Richtung da.
Nach schmerzhaften Kopfzerbrechen und keiner Lösung weiß ich leider nicht mehr weiter! Ich finde immer nur Lösungen mit Arrays, aber Arrays haben wir noch nicht gemacht und unser Prof. wird auch nicht erlauben, dass wir diese anwenden!
Wie kann ich jetzt die Bitzahl in der richtigen Reihenfolge anzeigen?
Zur Zeit steht sie so da:
Dezimaleingabe: 25
Bitausgabe: 10011
Richtig wäre aber 11001 hm, wäre über jeden Tip froh!
Vielen dank,
lg Ines
Ich habe diese Frage in keinem Forum auf anderen Internetseiten gestellt.
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 17:33 Fr 19.10.2007 | Autor: | o.tacke |
Hallo, Ines!
Tipp: 25 (dez) = 11001 (bin)
lässt sich (dezimal) darstellen als 1*1 + 0*10 + 0*100 + 1*1000 + 1*10000
Falls das nicht hilft, schreibe doch noch dazu, wie du die Ausgabevariable speicherst (Datentyp) und wie dein Algorithmus aussieht. Dann kann man gezielter Tipps geben.
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 17:40 Fr 19.10.2007 | Autor: | Mumrel |
Hi,
als weitere Idee wäre es das Problem rekursiv zu lösen.
Ein ähnliches Problem dass du vemutlich auf dein Problem übertragen kannst.
Rekursiv einen String spiegeln.
func readandmirror()
a = read();
if a != ENTER then
readandmirror();
else
return;
end if;
print a;
end func
Eingabe ASD(ENTER)
Ausgabe DSA
Grüße Mumrel
|
|
|
|
|
Hallo,
ich weiß natürlich auch nicht, wie du die Daten speicherst oder ausgibst, aber als Anregung mal mein Beispiel:
int mask;
for (mask = 0x8000; mask; mask >>= 1) printf("%c", dec & mask ? '1' : '0');
Rekursive Lösungen sind immer sehr speicherintensiv, davon würde ich mal abraten außer zu akademischen Zwecken.
Gruß
Martin
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 19:39 Fr 19.10.2007 | Autor: | Ines27 |
hallo!
Danke erstmal für die Antworten! :)
Ich lese einen int ein und habe es bis jetzt so gemacht, dass durch den Rest von % mit printf eine 0 oder eine 1 (auch int) ausgegeben habe. Hier schreibt er mirs dann halt aber logischerweise in die falsche Richtung! :)
lg
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 21:15 Fr 19.10.2007 | Autor: | Martin243 |
Hallo,
dann habe ich ja richtig gelegen. Also musst du die Zahl nur in der richtigen Reihenfolge abarbeiten. Da die dezimale Zahl aber eh in binärer Form im Speicher liegt, brauchst du den %-Operator nicht. Ich habe mal das komplette Programm von oben etwas verändert. Kernstück ist nach wie vor ein Maske, die eine Eins und sonst Nullen enthält. Die Eins wandert von links nach rechts und klappert einfach alle Bits der ursprünglichen Zahl ab und gibt sie aus.
Der komplette Code:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
unsigned int mask = 0x80000000, dec;
scanf("%ud", &dec);
do printf("%d", dec & mask ? 1 : 0); while (mask >>= 1);
exit(0);
}
Gruß
Martin
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 11:42 So 21.10.2007 | Autor: | Ines27 |
Hallo!
Leider bin ich eine Anfängerin, und hab den code nicht verstanden, den du geschrieben hast! :(
Ich habe dafür aber diese Lösung zusammengebastelt, aber irgendwas stimmt noch nicht so ganz und ich finde den Fehler einfach nicht:
int main()
{
//variablen deklarieren und befüllen
int decimal_number = 0;
int counter = 31;
scanf("%d", decimal_number);
//schleife, die alle 32 dual-stellen durchläuft
for (counter = 31; counter = 0; counter--)
{
if (decimal_number >= (2^counter))
{
printf("1");
decimal_number = decimal_number - (2^counter);
}
else
printf("0");
// alle 8 dual-stellen eine leerzeichen einfuegen
if (counter % 8 == 0)
printf(" ");
}
return 0;
}
|
|
|
|
|
Hallo,
ja, da sind einige Fehler im Code. Ich gehe den Code mal durch, denn einiges passt hier nicht zusammen:
int decimal_number = 0;
int counter = 31;
//Ich sehe gerade, dass du das Problem durch den Vergleich per größer-gleich etwas komplizierter machst als nötig. Aber das schaffen wir schon. Dafür müssen wir aber unsere Dezimalzahl als unsigned (nicht vorzeichenbehaftet) deklarieren. Du kannst die Initialisierungen aber auch weglassen, also
unsigned int decimal_number;
int counter;
scanf("%d", decimal_number);
//Das ist falsch. Hier muss ein Pointer hin. Da wir aber bereits einen int deklariert haben, nehmen wir eine Referenz auf decimal_number. Das u kommt von unsigned:
scanf("%ud", &decimal_number);
for (counter = 31; counter = 0; counter--)
//Gemeint war wohl eher:
for (counter = 31; counter >= 0; counter--)
/*Um nicht zufällig eine Zuweisung vorzunehmen, wo keine erwünscht ist, wird auch empfohlen, bei Vegleichen etwaige Konstanten links hinzuschreiben, also statt a==5 lieber 5==a. */
if (decimal_number >= (2^counter))
/* Ein großer Irrtum! Das Dach steht nicht für Potenzen, sondern für bitweises XOR! Wir bräuchten hier entweder die <math.h> oder, weil es hier 2er-Potenzen sind, den Shift-Operator: */
if (decimal_number >= (1 << counter))
/* Dasselbe gilt auch in der nächsten Zeile mit der Potenz*/
Der Rest ist ok.
Weil es etwas unleserlich war, hier nochmal der ganze Code:
int main()
{
//variablen deklarieren und befüllen
unsigned int decimal_number;
int counter;
scanf("%ud", &decimal_number);
//schleife, die alle 32 dual-stellen durchläuft
for (counter = 31; counter >= 0; counter--)
{
if (decimal_number >= (1 << counter))
{
printf("1");
decimal_number = decimal_number - (1 << counter);
}
else
printf("0");
// alle 8 dual-stellen eine leerzeichen einfuegen
if (counter % 8 == 0)
printf(" ");
}
return 0;
}
Gruß
Martin
|
|
|
|