2009-06-06 8 views
4

Ich weiß, wie man Binär in Dezimal konvertiert. Ich kenne mindestens 2 Methoden: Tabelle und Macht ;-)Wandle wirklich große Zahl von binär in dezimal um und drucke es

Ich möchte Binär in Dezimal konvertieren und diese Dezimalzahl drucken. Darüber hinaus interessiert mich diese "Dezimalstelle" nicht; Ich möchte es nur ausdrucken.

Aber, wie ich oben schrieb, kenne ich nur 2 Methoden, um binär in dezimal zu konvertieren, und beide benötigten Addition. Also berechne ich einen Wert für 1 oder 0 in binär und füge es dem gemerkten Wert hinzu. Dies ist ein dünner Ort. Ich habe eine wirklich große Zahl (1 und 64 Nullen). Während der Konvertierung muss ich ein Zwischenergebnis in eine Variable schreiben. In C habe ich einen "int" -Typ, der nur 4 Bytes und nicht mehr als 10^11 ist.

So, ich habe nicht genug Speicher, um Zwischenergebnis bei der Konvertierung von Binär zu Dezimal speichern. Wie ich oben schrieb, bin ich nicht interessiert, dass Dezimal, ich möchte nur das Ergebnis drucken. Aber, ich sehe keine anderen Möglichkeiten, um es zu lösen ;-(Gibt es eine Lösung, um "nur" aus binären zu drucken?

Oder vielleicht sollte ich etwas wie BCD (Binary Coded Decimal) für die Zwischenrepräsentation verwenden ? Ich möchte das wirklich nicht verwenden, weil es nicht so plattformübergreifend ist (Intels Prozessoren haben eine eingebaute Funktion, aber für andere muss ich eine eigene Implementierung schreiben.)

Ich würde mich freuen .. C.

+1

Nur eine Frage, wie ist diese Binärzahl gespeichert? –

+0

Es ist nicht trivial, ein zufälliges Bit (oder eine Folge von vier Bits) in eine Dezimalziffer umzuwandeln. Der bekannteste Fall, in dem wir * dies * wünschen, ist der BPP-Algorithmus für pi: Sie können jedes Bit oder jede * hex * Ziffer berechnen, aber Sie können die Dezimalziffer nicht mit diesem Algorithmus erhalten (außer Du willst eine riesige Konvertierung machen) – Fixee

Antwort

4

Größter Standard Integral-Datentyp ist unsigned long long int - auf meinem System (32-Bit-Linux auf x86) hat es Bereich 0 - 1.8 * 10^20 was nicht genug für Sie ist, müssen Sie Ihren eigenen Typ (struct oder Array) und schreiben Sie grundlegende Mathematik (im Grunde brauchen Sie nur einen Zusatz) für diesen Typ.

Wenn ich Sie wäre (und Speicher ist kein Problem), würde ich ein Array verwenden - ein Byte pro Dezimalstelle statt BCD. BCD ist kompakter, da es 2 Dezimalziffern pro Byte speichert, aber Sie müssen viel mehr Aufwand betreiben, wenn Sie separat mit hohen und niedrigen Nibbles arbeiten.

Und um zu drucken, fügen Sie einfach '0' (Zeichen, nicht Ziffer) zu jedem Byte Ihres Arrays und Sie erhalten eine druckbare Zeichenfolge.

+0

Ja, nach der Nacht bin ich zur selben Lösung gekommen ;-) –

-1

konnte nicht Sie weisen Speicher für, sagen wir, 5 int ist, und speichern Sie Ihre Nummer an der b: Ihre Meinung Vielen Dank für Geduld

Sprache hören eginning des Arrays? Dann iterieren Sie das Array manuell in int-Chunks. Vielleicht etwas wie:

0

Nun, wenn Sie von binär zu dezimal konvertieren, brauchen Sie wirklich nicht alle binären Bits zur gleichen Zeit. Sie brauchen nur die Bits, für die Sie gerade die Potenz berechnen, und wahrscheinlich eine Doppelvariable, um die Ergebnisse zu speichern. Sie könnten den binären Wert in ein Array setzen, sagen wir i [64], iterieren Sie durch, erhalten Sie die Leistung abhängig von ihrer Position und fügen Sie sie dem Double hinzu.

+2

Würdest du nicht eine ganze Menge davon brauchen? 999999 ist 0xf423f, aber wenn Sie ein Bit in der zweitniedrigstwertigen hexadezimalen Zahl ändern (so haben Sie 0xf427f), ändert sich jede Dezimalstelle und Sie erhalten 1000063. – Chris

6

Ich empfehle dringend eine Bibliothek wie GMP (GNU Multiprecision-Bibliothek) zu verwenden. Sie können den mpz_t Datentyp für große Zahlen verwenden, die verschiedene import/export routines Ihre Daten in ein mpz_t zu bekommen, und dann mpz_out_str() verwenden Sie es in der Basis auszudrucken 10.

+0

abgeordnet. GMP macht das Zeug einfach. –

+0

Ich weiß über GMP gut, aber ich bin nicht was ich will. –

+1

Warum möchten Sie nicht GMP? Funktioniert LGPL nicht für dich? Es dauert etwa 3 Funktionsaufrufe, um zu erreichen, was Sie wollen (importieren, drucken, aufräumen), und es wird schneller und weniger fehlerhaft als alles, was Sie sich vorstellen können. –

0

Konvertieren wirklich in Dezimalzahlen bedeutet jede Zehnerpotenz zu berechnen, so warum nicht einfach diese in einem Array von Bytes speichern? Dann wird nur durch das Array gedruckt.