tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
14
ZUGRIFFE
5079
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Trendy Andy Trendy Andy ist offline Mitglied Bronze
    Registriert seit
    May 2004
    Beiträge
    39
    Hi,

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

  2. #2
    basd basd ist offline Mitglied Brokat
    Registriert seit
    Nov 2003
    Ort
    München
    Beiträge
    264
    du meinst schon strings oder ?
     

  3. #3
    Avatar von BadMourning
    BadMourning BadMourning ist offline Mitglied Gold
    Registriert seit
    Dec 2003
    Beiträge
    158
    mußt du selber schreiben, hat aber sicher schon jemand im Forum für dich gemacht, einfach mal danach suchen...
     

  4. #4
    Trendy Andy Trendy Andy ist offline Mitglied Bronze
    Registriert seit
    May 2004
    Beiträge
    39
    Hast du nen Link? Ich find nix!

    EDIT: Hab da mal was bei google gefunden! Link
    Muss ich mal ausprobieren.
    Geändert von Trendy Andy (07.08.04 um 19:38 Uhr)
     

  5. #5
    Registriert seit
    May 2004
    Beiträge
    287
    Bsp.:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    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.
     

  6. #6
    Trendy Andy Trendy Andy ist offline Mitglied Bronze
    Registriert seit
    May 2004
    Beiträge
    39
    Hab deinen Quelltext mal ausprobiert! Compilieren tut er, aber das Programm stürtzt mit nen Fehler ab! Woran liegt das?
     

  7. #7
    Registriert seit
    Jul 2003
    Ort
    Duisburg (NRW)
    Beiträge
    1.788
    Der Ansatz von Dudadida ist gut. Ich habe das mit dem Umdrehen behoben und auch den Absturz entfernt:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    
    #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.
    Geändert von Kachelator (08.08.04 um 21:04 Uhr)
     
    Chor: "Wir sind der Chor, und wir stimmen zu. Wir stimmen zu, wir stimmen zu, wir stimmen zu."

  8. #8
    Trendy Andy Trendy Andy ist offline Mitglied Bronze
    Registriert seit
    May 2004
    Beiträge
    39
    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.
     

  9. #9
    Registriert seit
    Jul 2003
    Ort
    Duisburg (NRW)
    Beiträge
    1.788
    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:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    
    #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?
     
    Chor: "Wir sind der Chor, und wir stimmen zu. Wir stimmen zu, wir stimmen zu, wir stimmen zu."

  10. #10
    Trendy Andy Trendy Andy ist offline Mitglied Bronze
    Registriert seit
    May 2004
    Beiträge
    39
    Hast du ne Idee wie man 2 Byte (oder mehr) binär einlesen kann?
     

  11. #11
    Trendy Andy Trendy Andy ist offline Mitglied Bronze
    Registriert seit
    May 2004
    Beiträge
    39
    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.
     

  12. #12
    Registriert seit
    Jul 2003
    Ort
    Duisburg (NRW)
    Beiträge
    1.788
    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.
     
    Chor: "Wir sind der Chor, und wir stimmen zu. Wir stimmen zu, wir stimmen zu, wir stimmen zu."

  13. #13
    Trendy Andy Trendy Andy ist offline Mitglied Bronze
    Registriert seit
    May 2004
    Beiträge
    39
    Hm. Bei fread kommt das selbe raus wie bei fgets. Mit iostreams kenn ich mich halt gar nicht aus.
     

  14. #14
    Trendy Andy Trendy Andy ist offline Mitglied Bronze
    Registriert seit
    May 2004
    Beiträge
    39
    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!
     

  15. #15
    Registriert seit
    May 2004
    Beiträge
    287
    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).
     

Ähnliche Themen

  1. Antworten: 5
    Letzter Beitrag: 02.12.10, 19:49
  2. Dezimalzahlen
    Von q1q im Forum Javascript & Ajax
    Antworten: 4
    Letzter Beitrag: 20.04.10, 21:04
  3. Antworten: 7
    Letzter Beitrag: 28.06.06, 18:42
  4. Dualzahlen speichern
    Von flooo im Forum Relationale Datenbanksysteme
    Antworten: 5
    Letzter Beitrag: 05.04.06, 15:57
  5. Linux skript zum umwandeln von Dezimal in dualzahlen
    Von borisbrause im Forum Sonstige Sprachen
    Antworten: 1
    Letzter Beitrag: 26.10.05, 21:55