Frage

Ich habe immer Strom, printf, string (x) oder was auch immer die betreffende Sprache verwendet angeboten numerische Typen in einem String oder zurück zu konvertieren. Allerdings habe ich nie wirklich darüber nachgedacht, wie dies tatsächlich geschehen ist. Ich suchte um auf Google, aber alle die Ergebnisse sind nur zu verwenden, diejenigen variieren Methoden, und nicht, wie die Konvertierung wirklich hinter den Kulissen getan wird: (

Für ganze Zahlen mit Binär-, Oktal und Hexadezimal scheint ziemlich einfach, da jeder „digit“ in der Zeichenkette einen Satz Gruppe von Bits repräsentiert (zB für die 2 hexadezimalen Ziffern I seine xxxxyyyy weiß), so dass ich es mit Bit-Verschiebungen tun könnte und wobei eine Stelle zu einer Zeit, zB für den Hexstring 0xFA20 der Wert "(15 << 12) | (10 << 8) | (2 << 4) | (0 << 0)".

Dezimalzahlen sind schwieriger, da die Basis 10 ist keine Basis 2 so und so ein Bit kann mehr bewirken als eine Nachkommastelle macht Umwandlung in beiden Richtungen komplexe ...

Wie bei Gleitkommazahlen Ich habe wirklich keine Ahnung. Ich denke, die ganze und Bruchteile getrennt betrachtet werden könnte, oder was? Was ist als eine exponentielle, eine festgelegte Anzahl von signifikanten Ziffern oder festgelegte Anzahl von Dezimalstellen?

War es hilfreich?

Lösung

Dezimal Umwandlungen sind ein bisschen langsamer, aber nicht wirklich viel komplexer. Schauen wir uns die hexadezimale Umwandlung ein bisschen mehr wie wir es wahrscheinlich in echten Code schreiben würde. Nur zum Beispiel in C ++ Sie könnte die Umwandlung so etwas tun:

char digits[] = "0123456789abcdef";
std::string result;

int input = 0xFA20;

while (input) {
    int digit = input & 0xf; // or: digit = input % 0xf;
    input >>= 4;             // or: input /= 16;
    result.push_front(digits[digit]);
}

Im Moment jedoch, dass hat einige magischen Zahlen. Lassen Sie uns loszuwerden von ihnen:

const int base = 16;

while (input) { 
    int digit = input % (base - 1);
    input /= base;
    result.push_front(digits[digit]);
}

Im Zuge der dieser magischen Zahlen loszuwerden, wir haben auch die Routine fast universell gemacht - wenn wir den Wert der ‚Basis‘ ändern, den Rest der Routine noch funktioniert, und wandelt die Eingabe in den angegebenen Base. Im Wesentlichen die einzige andere Änderung, die wir machen müssen mehr auf die „Ziffern“ Array ist das Hinzufügen, wenn wir Unterstützung Basen größer als 16 wollen.

Dies ignoriert auch ein paar Dinge für Einfachheit. Am offensichtlichsten, wenn die Zahl negativ ist, Sie in der Regel eine Flagge, convert auf eine positive Zahl gesetzt, und am Ende, wenn das Flag gesetzt wurde, legen eine ‚-‘ in den String). Mit 2-Komplement gibt es eine Ecke Fall für die maximal negative Zahl ist, die (ohne weitere Bereich in einen Typ umzuwandeln) kann nicht in eine positive Zahl umgewandelt werden. Normalerweise geht man mit, dass die von den meisten Arten zu fördern. Für Ihre größte Integer-Typ (die Sie nicht fördern kann) ist es in der Regel nur schwer Code am einfachsten, dass ein Wert.

Im Prinzip floating point ist nicht viel anders - Sie im Grunde immer noch mathematische Manipulationen tun eine Ziffer zu einem Zeitpunkt zu erzeugen. In der Tat wird es komplizierter, weil Sie in der Regel mit einem paar verschiedenen Formaten zu tun haben (zumindest ein „basic“ Floating-Point und eine Art „Scientific“ -Format) sowie Variablen für Feldbreite und Präzision. Durch die Zeit, die Sie mit dem beschäftigt haben, beenden Sie mit ein paar hundert Zeilen Code oder so - kein besonders unerhörte Menge, aber wahrscheinlich ein bisschen mehr als Marken hier sind Sinn

.

Andere Tipps

  

suchte ich bei Google um, aber alle die Ergebnisse sind nur diejenigen, variiert Methoden zu verwenden, und nicht, wie die Konvertierung wirklich hinter den Kulissen getan wird: (

Aus Leistungsgründen von einer Darstellung in einer anderen umzuwandeln (insbesondere Gleitkomma- / integer Umwandlungen) ist oft ein Low-Level-CPU-Befehl und wird an der Prozessor-Ebene implementiert. Deshalb sollten Sie es normalerweise nicht sehen eine Sprachebene neu implementiert in Bibliotheken oder bei.

Dies ist besonders häufig in der Signalverarbeitungs Welt, zum Beispiel, wo Sie wollen eine Wellenform nehmen und es in einen diskreten ganzzahligen Wert in einem gewissen Bereich umwandeln.

Für ganze Zahlen Sie Divisionsrest finden können, ist dies letzte Ziffer, durch 10 teilen, fand modularen Rest - das ist ein, aber letzte Stelle, und so weiter. Gleitkommazahlen sind aus zwei Teilen aufgebaut - signifikante Stellen und Exponenten, d.h. number = significant.digits * (Basis ^ Exponent), in dem die Basis 10 sein kann, 2 oder andere Nummer.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top