array auf inhalt überprüfen (is binary?)



  • Hallo,

    Ich möchte die eingelesenen (32 stelligen) Zahl verwenden um diese dann in decimal und hex zu konvertieren (ich weiß, dass es mit array funktioniert), aber ich würde es gerne numerisch machen:

    z.b. in dec

    for(bit=0,dec=0,exp=0;bin>0;)
    {
    		 bit=bin%10;
    		 bin/=10;
    		 for(i=0;i<exp;i++)bit*=2;
    		 dec+=bit;
    		 exp++;
    }
    

    Die 107bit kommen daher, dass die größte 32stellige Zahl 2^106.3 ist
    also 107bit benötigt um dargestellt zu werden.

    mfg christoph



  • Hallo Christoph,

    du bist dir sicher, daß du eine 32 stellige Dezimalzahl meinst?
    Bisher war immer die Rede von einer 32 stelligen Binärzahl. Und die paßt in einen unsigned long - ein Bit je Stelle.

    Willst du mit größeren Zahlen als 2^32 arbeiten, sieh dir mal die folgende Bibliothek an: GNU MP Bignum Library.
    Informationen zu dieser Bibliothek und die Bibliothek selbst findest du unter http://gmplib.org

    mfg Mario



  • Dies ist zwar keine 32 stellige Zahl, aber das Prinzip ist das gleiche:
    1348 = 8100 + 4101 + 3 * 102 + 1 * 103

    Daraus möchtest du nun ein binäres Format erzeugen ( warum auch immer 😃 ). Müsste man sich vorher überlegen, wie die Einsen und Nullen gespeichert werden sollen.
    So:
    typedef unsigned long uint128[4]; 128 Bit Typ
    Oder so:
    typedef unsigned char uint[128]; '128 Bit' Typ

    Die zweite Variante dürfte handlicher und schneller in der Ausführung sein ( Vermutung ). Braucht etwas mehr Speicher, aber wen juckts.
    Ist die Zahl erstmal konvertiert, kannst du sie immer noch recht einfach in den ersten Typ umwandeln.

    Gruß,
    c.



  • coverter schrieb:

    Dies ist zwar keine 32 stellige Zahl, aber das Prinzip ist das gleiche:
    1348 = 8100 + 4101 + 3 * 102 + 1 * 103

    Die 10n verursachen bei n = 10 eine Überschreitung des unsigned long Wertebereichs. Denn: 1010 > ULONG_MAX.

    Du könntest z.B. die Zehnerpotenzen so bilden:
    Nimm einen geeigneten Datentypen, z.B

    #define BITS 128
    typedef unsigned char uint128[BITS];
    

    Setze das LSB auf 1. Dann multipliziere in jedem Durchlauf binär mit 10.
    So bildest du in jedem Durchlauf die Zehnerpotenzen (100,101,102, usw.)

    Die einzelnen Zahlen der zu konvertierenden Zahl kannst du leicht ins Binäre übertragen, denn eine einzelne Zahl kann ja nicht größer als 9 Werden. Diese Zahlen multiplizierst du in jedem Durchlauf mit der zugehörigen Zehnerpotenz im Binären und addierst diese zum Ergebnis.

    Dies ist eine Möglichkeit, die mir einfällt, wie man 32 stellige Zahlen ins Binäre überführen kann. Man kann auch wesentlich größere Zahlen bearbeiten, wenn man die BITS entsprechend höher schraubt.

    Gruß, mr. a.



  • Hallo Christoph,

    langsam dämmert mir, wo du hin willst.
    mit deinem Konstrukt

    bit=bin%10;
       bin/=10;
    

    machst du ja nichts anderes als rauszukriegen, an welcher Stelle - von hinten beginnend - deine eingegebene 'Binärzahl' eine '1' enthält.
    Diese '1'multiplizierst du dann mit der Stellenwertigkeit (2^exp):

    for(i=0;i<exp;i++)bit*=2;
    

    und adierst das ganze letztendlich zu deinem Ergebnis:

    dec+=bit;
    

    An welcher Stelle in der Binärzahl eine '1' steht, kannst du schon mit dem C-String aus deiner Eingabe rauskriegen:
    Du übergibst also deinen C-String an die Funktion und kopierst den Zeiger auf den Anfang des C-Strings. Den brauchen wir, um zu erkennen, wann der gesamte C-String mit deiner Binärzahl umgewandelt ist.
    Dann suchst du das Ende deiner 'Binärzahl' (Ende des C-Strings: '\0') mit dem kopierten Zeiger und stellst den Zeiger dann um eins zurück auf die letzte Stelle deiner Binärzahl - wir beginnen also auch hier von hinten!:

    unsigned long binToDec (char * bin)
       {
       char * digit = bin;
       while (*digit != '\0') ++digit;
       --digit;
    

    Jetzt brauchen wir noch zwei Variablen; eine für das Umwandlungsergebnis und eine für die Stellenwertigkeit (ich nehme hier gleich die Stellenwertigkeit, da es die Berechnungen erleichtert. Du kannst genauso den Exponenten als Variable Wählen und dann mit 2^exp die Stellenwertigkeit errechnen). Die Stellenwertigkeit initialisiere ich mit 'weight=1', da ich mit der letzten (niederwertigsten) Stelle der Binärzahl beginne und diese die Wertigkeit 1 hat.:

    unsigned long dec = 0;
       unsigned long weight=1;
    

    Soweit die Vorbereitung. Jetzt kommt es zur eigentlichen Umwandlung.
    Dabei durchlaufen wir die Binärzahl in deinem C-String von hinten nach vorne mit dem Zeiger 'digit', bis wir die erste Stelle der Binärzahl in die Berechnung einbezogen haben ('bin <= digit').
    Zuerst prüfen wir, ob an der aktuellen Stelle der Binärzahl eine '1' steht. Nur dann müssen wir die Wertigkeit der Stelle zum Dezimalwert addieren ('dec += weight').
    zum Schluß wird der Zeiger 'digit' auf eine Stelle weiter vorn gesetzt ('--digit') und die zugehörige Wertigkeit dieser Stelle berechnet, die ja doppelt so groß ist wie die zuvor betrachtete ('weight *= 2'):

    while (bin <= digit)
          {
          if (*digit == '1')
             {
             dec += weight;
             };
          --digit
          weight *= 2;
          };
    

    Das war's dann schon mit der Umwandlung von binär nach dezimal. Jetzt muß nur noch der errechnete Dezimalwert zurückgegeben werden:

    return dec;
       };
    

    Und nun nochmal alles zusammen:

    unsigned long binToDec (char * bin)
       {
       char * digit = bin;
       while (*digit != '\0') ++digit;
       --digit;
    
       unsigned long dec = 0;
       unsigned long weight=1;
    
       while (bin <= digit)
          {
          if (*digit == '1')
             {
             dec += weight;
             };
          --digit;
          weight *= 2;
          };
    
       return dec;
       };
    

    mfg Mario



  • mario_69 schrieb:

    ...
    machst du ja nichts anderes als rauszukriegen, an welcher Stelle - von hinten beginnend - deine eingegebene 'Binärzahl' eine '1' enthält.
    ...
    mfg Mario

    Es wird doch eine Dezimalzahl eingegeben? 😕



  • Hallo mr. algorithm,

    wenn du weiter vorn anfängst zu lesen, wirst du feststellen, daß es hier um einen Konverter von binär nach dezimal und hexadezimal geht.

    mfg Mario


Anmelden zum Antworten