www.vorhilfe.de
- Förderverein -
Der Förderverein.

Gemeinnütziger Verein zur Finanzierung des Projekts Vorhilfe.de.
Hallo Gast!einloggen | registrieren ]
Startseite · Mitglieder · Impressum
Forenbaum
^ Forenbaum
Status VH e.V.
  Status Vereinsforum

Gezeigt werden alle Foren bis zur Tiefe 2

Navigation
 Startseite...
 Suchen
 Impressum
Das Projekt
Server und Internetanbindung werden durch Spenden finanziert.
Organisiert wird das Projekt von unserem Koordinatorenteam.
Hunderte Mitglieder helfen ehrenamtlich in unseren moderierten Foren.
Anbieter der Seite ist der gemeinnützige Verein "Vorhilfe.de e.V.".
Partnerseiten
Weitere Fächer:

Open Source FunktionenplotterFunkyPlot: Kostenloser und quelloffener Funktionenplotter für Linux und andere Betriebssysteme
Forum "C/C++" - Dezimal- in Binärzahl
Dezimal- in Binärzahl < C/C++ < Programmiersprachen < Praxis < Informatik < Vorhilfe
Ansicht: [ geschachtelt ] | ^ Forum "C/C++"  | ^^ Alle Foren  | ^ Forenbaum  | Materialien

Dezimal- in Binärzahl: umwandlung von zahlen
Status: (Frage) beantwortet Status 
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.

        
Bezug
Dezimal- in Binärzahl: Antwort
Status: (Antwort) fertig Status 
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.


Bezug
        
Bezug
Dezimal- in Binärzahl: Antwort
Status: (Antwort) fertig Status 
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







Bezug
        
Bezug
Dezimal- in Binärzahl: Antwort
Status: (Antwort) fertig Status 
Datum: 17:49 Fr 19.10.2007
Autor: Martin243

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

Bezug
        
Bezug
Dezimal- in Binärzahl: input / output
Status: (Mitteilung) Reaktion unnötig Status 
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

Bezug
                
Bezug
Dezimal- in Binärzahl: Mitteilung
Status: (Mitteilung) Reaktion unnötig Status 
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

Bezug
                        
Bezug
Dezimal- in Binärzahl: Frage (beantwortet)
Status: (Frage) beantwortet Status 
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;
}

Bezug
                                
Bezug
Dezimal- in Binärzahl: Antwort
Status: (Antwort) fertig Status 
Datum: 17:32 So 21.10.2007
Autor: Martin243

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

Bezug
Ansicht: [ geschachtelt ] | ^ Forum "C/C++"  | ^^ Alle Foren  | ^ Forenbaum  | Materialien


^ Seitenanfang ^
ev.vorhilfe.de
[ Startseite | Mitglieder | Impressum ]