# Umwandlung von Dezimalzahlen in Dualzahlen!



## Trendy Andy (7. August 2004)

Hi,

gibt es in C/C++ schon eine vordefinierte Funktion, die Dezimalzahlen in Dualzahlen umwandelt oder muss ich die mir selber schreiben?


----------



## basd (7. August 2004)

du meinst schon strings oder ?


----------



## BadMourning (7. August 2004)

mußt du selber schreiben, hat aber sicher schon jemand im Forum für dich gemacht, einfach mal danach suchen...


----------



## Trendy Andy (7. August 2004)

Hast du nen Link? Ich find nix!

EDIT: Hab da mal was bei google gefunden! Link 
Muss ich mal ausprobieren.


----------



## Dudadida (7. August 2004)

Bsp.:

```
std::string dualzahl = "";

int zahl = 439828;

for (int i = zahl; i != 0; )
{
  if (i & 1) dualzahl = dualzahl + std::string("1");
  else dualzahl = dualzahl + std::string("0");
  i = i >> 1;
}
```

Hab mir das jetzt gerade aus den Fingern gesogen und nicht getestet. Du musst auf jeden Fall den String noch umdrehen.


----------



## Trendy Andy (8. August 2004)

Hab deinen Quelltext mal ausprobiert! Compilieren tut er, aber das Programm stürtzt mit nen Fehler ab! Woran liegt das?


----------



## Kachelator (8. August 2004)

Der Ansatz von Dudadida ist gut. Ich habe das mit dem Umdrehen behoben und auch den Absturz entfernt:

```
#include <iostream>   // für io
#include <sstream>    // für's umwandeln (stringstreams)
#include <algorithm>  // für's umdrehen (coole algorithmen)

using std::string;
using std::ostringstream;
 
int main(void)
{
  int zahl = 439828; // unser input

  ostringstream os;  // hier drin binärziffern sammeln

  for ( int i = zahl; i != 0; )
  {
    // es wird immer das rechte bit untersucht (also bit 0)
    // wenn zahl ungerade (Bit 0 == 1), dann
    // "1" an den ostringstream hängen, sonst "0"
    if (i & 1) 
      os << "1";
    else 
      os << "0";
    
    i >>= 1; // nach rechts shiften, um nächste 
             // binärziffer zu untersuchen 
             // (entspricht teilen durch zwei)
  }

  string dualzahl = os.str(); // in string kopieren

  std::reverse( dualzahl.begin(), dualzahl.end() ); // string umdrehen

  std::cout << "Ergebnis: " << dualzahl; // ausgabe

  // warten
  char c;
  std::cin >> c;

  return 0;
}
```

Das Problem von Dudadidas Code war, dass man nicht einfach ein int zu einem String addiereren kann.

PS: Code läuft mit VS6, sollte aber eigentlich überall laufen.

--Edit:
Mir war noch eingefallen, dass man eventuell mit Streammanipulatoren arbeiten könnte, aber setbase kann leider kein Binärformat.


----------



## Trendy Andy (8. August 2004)

Wow! Danke für die fixe Antwort! Klappt wunderbar!

Hab aber noch ein kleines Problem! Ich will eine Datei binär einlesen. Das mach ich mit getc. Wie kann ich jedoch 2 byte binär einlesen? Mit fgets liest er mir dummerweise das ASCII Zeichen ein! Ich brauch aber Dezimalzahlen.


----------



## Kachelator (8. August 2004)

> _Original geschrieben von Trendy Andy _
> *Hi,
> 
> gibt es in C/C++ schon eine vordefinierte Funktion, die Dezimalzahlen in Dualzahlen umwandelt oder muss ich die mir selber schreiben? *



Nö. ... Doch halt! Nun gibt es sie: 

```
#include <iostream>   // für io
#include <sstream>    // für's umwandeln
#include <algorithm>  // für's umdrehen

using std::string;
using std::ostringstream;
 
string binary( unsigned int zahl )
{
  ostringstream os;  // hier drin binärziffern sammeln

  for ( int i = zahl; i != 0; )
  {
    // es wird immer das rechte bit untersucht
    // wenn zahl ungerade (Bit 0 == 1),
    // 1 an den ostringstream hängen, sonst 0
    if (i & 1) 
      os << "1";
    else 
      os << "0";
    
    i >>= 1; // nach rechts shiften, um nächste 
             // binärziffer zu untersuchen 
             // (entspricht teilen durch zwei)
  }

  string dualzahl = os.str(); // in string kopieren

  std::reverse( dualzahl.begin(), dualzahl.end() ); // string umdrehen

  return dualzahl;
}

void wait()
{
  // warten
  char c;
  std::cin >> c;
}

int main(void)
{
  std::cout << "Ergebnis: " << binary( 439828 ); 

  wait();
  return 0;
};
```

---Edit:

Huch! Habe gerade erst deinen Post gesehen. Kannst du dein Problem genauer erklären? Code posten oder so?


----------



## Trendy Andy (8. August 2004)

Hast du ne Idee wie man 2 Byte (oder mehr) binär einlesen kann?


----------



## Trendy Andy (8. August 2004)

Also ich hab mit nen Hex Editor eine Datei erstellt. (Inhalt: 0A 91 AB 11 2F 6D 00 9C 55 08 E1) Wenn ich mit getc 0A einlese, dann krieg ich ne 10 Dezimal! Jetzt will ich aber 91 AB, also 2 Byte, einlesen. Da müsste 43921 rauskommen. Mit fgets kann ich 2 Byte einlesen, nur krieg ich dann nen ASCII Zeichen.


----------



## Kachelator (8. August 2004)

Versuch es doch mal mit fread(). Da kannst du die Anzahl der zu lesenden Bytes angeben. Besser noch wäre, wenn du dich in den Gebrauch von iostreams (ifstream, ofstream und auch std:.cin und cout) einarbeitest , anstatt diese gemeingefährlichen C-Missgeburten wie fgetc und so weiter zu verwenden.


----------



## Trendy Andy (8. August 2004)

Hm. Bei fread kommt das selbe raus wie bei fgets. Mit iostreams kenn ich mich halt gar nicht aus.


----------



## Trendy Andy (9. August 2004)

hab ne Lösung gefunden! Ich les beide Bytes mit getc ein. 2 Byte integer = 1.Byte*256 + 2. Byte! Bei meinen Beispiel war das 145*256+171=37291=91AB!

PS: Die 43000 von oben war falsch!


----------



## Dudadida (11. August 2004)

> _Original geschrieben von Kachelator _
> *
> Das Problem von Dudadidas Code war, dass man nicht einfach ein int zu einem String addiereren kann.
> *



Mach ich doch eigentlich gar nicht, funktioniert aber trotzdem nicht (bzw. meine Version hat bei mir gar nicht compiliert  ). Wenn man nicht mit ostream arbeiten möchte, kann man auch an dualzahl mit der Methode append die Einzen und Nullen anhängen.

@Trendy Andy: Du kannst auch direkt mit fread in eine Variable bestimmter Größe einlesen und diese dann umwandeln. Der 2 Byte-Typ wäre dann short und fread sagst du dann, dass er 2 bytes einlesen und an die Adresse deiner short Variable schreiben soll.
Für 4 Bytes nimmst du dann halt int, für 8 _int64.
Ich würde die Binärfunktion dann noch für die beiden Typen überladen und eine Formatierungsoption einbauen (also halt immer 16 bzw. 32 Ziffern für short oder eben int).


----------

