beliebig große Binärzahlen -> Dezimalzahlen



  • Hallo,
    ich möchte gerne beliebig große Binärzahlen, die in einem Array gespeichert sind, in Dezimaldarstellung umwandeln (auch in einem Array). Gibt es da eine einfache Möglichkeit, das zu bewerkstelligen? Wenn ja, wie kann ich das am einfachsten machen? Natürlich könnte ich eine Library für große Zahlen benutzen, aber ohne wäre besser.
    Danke!



  • schau mal, vielleicht kann dir std::bitset da helfen.



  • Naja, wie in der Schule eben. Steht an der letzten Position (N) des Arrays an Binärzahlen ein 1, dann kannst Du zu deinem Dezimalinteger 2^0 hinzufügen, sonst nicht. Steht an der Position N-1 eine 1, dann kannst Du 2^(N-(N-1)) adddieren.

    Integer change(char* bin, int len) {
        Integer num = 0;
        for (int i = len-1; i >= 0; --i)
             if (bin[i] == '1') num += rechne_2_hoch(len-1-i);
        return num;
    }
    

    Die Klasse Integer selbst, ist, wenigstens in der naiven Implementierung, auch keine große Sache.



  • @kingruedi
    Nein, Bitset hat eine feste Größe, es geht ja um beliebig große Binärzahlen. Außerdem bringt mich das auch nicht wirklich weiter.

    @Daniel E.
    Es ist mir schon klar, wie man Binärzahlen in Dezimalzahlen umwandelt. Ich wollte mich nur vergewissern, ob es eine einfachere Möglichkeit gibt, als gleich eine Klasse zum Rechnen mit beliebig großen Zahlen zu implementieren. Aber darauf wird es wohl hinauslaufen.

    Weiß jemand zufällig, wie das in Java mit dem Bigint (der meines Wissens ja Binärdarstellung verwendet) gemacht wurde?



  • Kleines Programm in C. Ist der effezienteste Algorithmus der mir auf die Schnelle eingefallen ist.

    #include <stdio.h>
    
    int mul(char *dec, int length, int m) {
        int i,j;
    
        j=0;
        for(i=0; i<length; i++) {
            j+=dec[i]*m;
            dec[i]=j%10;
            j/=10;
        }
        for(;j>0; i++) {
            dec[i]=j%10;
            j/=10;
        }
        return i;
    }
    
    int add(char *dec, int length, int m) {
        int i,j;
    
        for(i=0;m>0; i++, m/=10) {
            if(i>=length)
                dec[i]=0;
            m+=dec[i];
            dec[i]=m%10;
        }
        if(i>length) return i;
        else return length;
    }
    
    int bin2dec(char *bin, char *dec) {
        int i,j,k;
        int length=0;
    
        for(j=0; bin[j]!='\0'; j++);
        j%=8;
        i=0;
    
        while(bin[i]!='\0') {
            int bit;
            k=0;
            for(; j>0; j--, i++) {
                bit=bin[i]-'0';
                k=k*2+bit;
            }
            j=8;
            length=mul(dec, length, 256);
            length=add(dec, length, k);
        }
    
        for(i=0, j=length-1; i<=j; i++, j--) {
            char temp=dec[i];
            dec[i]=dec[j]+'0';
            dec[j]=temp+'0';
        }
        dec[length]='\0';
        return 0;
    }
    
    int main() {
        char bin[]="10011011101001101100111001110111011000110010010101110011";
        char dec[100];
        bin2dec(bin, dec);
        printf(dec);
    }
    

Anmelden zum Antworten