bin->dez (mit basen > 2^32)

HentaiD

Mitglied
Hallo,
habe schon die SuFu benutzt, aber nichts passendes gefunden.
Ich möchte eine Binärzahl zu einer Dezimalzahl umwandeln. An sich kein weiter schwieriges Unterfangen. Hätte dann einfach die Bits aufaddiert á la 2^0+2^1 etc.
Das ganze hört bei unsigned int aber bekanntlich bei 2^32 auf.

Mein Problem ist jetzt folgendes:
Ich verstehe nicht, wie ich größere Zahlen umwandeln soll.
Meine Zahlen sind binär in vielen unsignes ints gespeichert und werden aneinandergehängt.
Bsp.: die Hexzahl f ffff ffff = 0b1111 1111 1111 1111 1111 1111 1111 1111 1111

oder eben 2^36, wenn ich micht vertan habe, oder 68719476735 in dez.
Hier ist das erste f eben in einem int gespeichert und die anderen 8 in einem anderen.

Lässt sich auch problemlos in hex umwandeln, so Schritt für Schritt.
Aber das ließe sich so Schritt für Schritt nicht nach dez umwandeln, da 1111 = 15.

Ich hoffe ich versteht, wo mein Problem liegt und habt vll. eine Idee, wie ich mit so großen Zahlen, bzw. mit diesen großen Basen rechnen kann. Ich hatte schon die Idee die Exponenten zu kleineren Teilen zu verarbeiten, aber die kann ich dann ja trotzdem nicht addieren, weil diese Zahl im Endeffekt wieder zu groß wäre. :(


Liebe Grüße, D
 
Zumindst VS kennt auch 64bit-Integer
Wenns noch größer sein soll, müsstest du einen einen eigenen Datentyp machen
(und dafür alle Rechenregeln vom Plus weg neu schreiben)

Da du aber nicht der erste mit dem Problem bist, gibts sowas schon fertig.
zB GMP (http://gmplib.org/)
 
Im Moment programmiere ich mit LCC. Ich habe vor eine 64 Bit long long Variable fürs Multiplizieren zu nutzen. Tatsächlich könnte die Eingabe ein paar Millionen Digits haben, was sich bisher auch wunderbar von dez->bin umwandeln lies und speichern lies.
Einen eigenen Datentyp habe ich vorgegeben:

typedef unsigned long long uint64;

typedef unsigned int uint32;

typedef struct
{
uint32 n;
uint32* words;
}
BigInt;

Addieren und Subtrahieren funktioniert auch wunderbar. Leider weiß ich überhaupt nicht wie ich mit dem Datentypen Bigint so hantieren kann, dass ich so große Basen einfach benutzen kann, da sich sonst alles bequem über die 32Bit ints regeln lässt + carrybit- Variable.

Ich werde mir die Lib mal genauer ansehen, aber ich sehe schon, dass es viiiel zu entdecken/suchen gibt.

Danke schonmal und wenn noch jemand eine Idee oder einen Codechnipsel oder so etwas hat, nehme ich das natürlich auch gerne. :D


Liebe Grüße, D
 
Zurück