Zahl in 64 bit big endian "konvertieren"



  • Hallo ich habe ein etwas komplexeres anliegen bei dem ich nicht weis wie man dies am besten angeht.

    Ich will eine Zahl in 64 bit big endian umwandeln.
    Diese 64 bit sind wie folgt aufgeteilt:

    - 1 bit Vorzeichen
    - 11 bit Charakteristik (steht so in meinem Buch)
    - 52 bit Mantisse

    Also erstelle ich in C einen int speichere meine Zahl darin und will diese dann ins hexaformat umrechnen, so das ich 16 bytes speichern kann.

    Einen byte kann ich ja mit dem Datentyp byte in eine Datei schreiben, aber wie komme ich nun von meinen int zu meiner gewollten Variante.

    Das ganze soll natürlich auch mit floats funktionieren.

    Hier ein kleines Beispiel:

    Zahl: 12310 entspricht binär 11110112

    nun muss diese Binärzahl "normalisiert" werden...

    11110112 ist normalisiert -26 * 1.1110112

    als nächstes berechne ich die "Verschiebungskonstante", bei 64 bit beträgt diese 102310 und da ich das Komma ja um 6 Stellen verschoben habe ist meine Verschiebungskonstante jetzt 102910

    diese 102910 sind binär 100000001012

    wenn ich das jetzt alles zusammen setzen würde, würde folgendes herauskommen (die Unterstriche dienen nur zur besseren Lesbarkeit):
    0 _ 100 0000 0101 _ 1110 1100 ...

    - erste 0 ist für das Vorzeichen
    - die nächste Zahl ( 100 0000 0101 ) ist meine Verschiebungskonstante ( 11 bit Charakteristik )
    - gefolgt von 1110 1100 ... was meine Mantisse wäre ( 52 bit Mantisse ), die 1 vor dem Komma wird nicht mit gespeichert

    so nun kann ich das alles noch hexadezimal umrechnen:
    0100 = 4
    0000 = 0
    0101 = 5
    1110 = E
    1100 = C
    und der rest halt als 0

    so das dies dann so aussieht 40 5E C0 ...

    mfg rendner



  • Und deine Frage lautet konkret wie?
    Willst du einen 64 Bit Wert in einen hexadezimalen String mit einem Zeichen für jede Tetrade umwandeln, oder wie soll man dein Problem verstehen?



  • Ja ich will eine 64 bit Zahl auslesen, die nach dem oben angegebenen Format gespeichert wurde so das ich diese anzeigen kann und wiederum eine Zahl in dieses Format überführen so das ich es speichern kann.

    Leider weis ich nicht wie ich in diesem Fall vorgehen soll.
    Da ich mir nicht vorstellen kann wie ich einen floatwert zu zerlegen habe das dies funktioniert.

    mfg rendner



  • Hat da keiner nen Tipp dazu parat?
    Eigentlich muss ich ja nur folgendes wissen:

    - die Zahl ins Binärsystem konvertieren, dabei kann die Zahl ruhig schon als String übergeben werden
    - als nächstes muss diese Zahl normalisiert werden, also eine 1 vor dem Komma
    ( was macht man eigentlich wenn man die Zahl 0.625 hat ?), somit ergibt sich die Verschiebungskonstante
    - dann die Binärzahl ins Hexasystem überführen

    So wäre zumindest meine Vorstellung, eventuell gehts auch anders...

    Wäre toll wenn wenigstens der eine oder andere etwas zu einem der Stichpunkte sagen könnte.

    mfg rendner



  • rendner schrieb:

    - die Zahl ins Binärsystem konvertieren

    Lernt man das nicht mehr in der Schule, 5. Klasse?

    Eine typische Implementierung in C ist in der FAQ: http://www.c-plusplus.net/forum/viewtopic-var-t-is-39490.html

    - als nächstes muss diese Zahl normalisiert werden, also eine 1 vor dem Komma
    ( was macht man eigentlich wenn man die Zahl 0.625 hat ?), somit ergibt sich die Verschiebungskonstante

    0,625 = 2^-1 + 2^-3, also binär: 0,101, bzw. normalisiert 1,01*2^-1

    Komma wandert nach links, dein Exponent wird um eins kleiner, bei einem Rechtsschub eins größer. Du traversierst also dein zahl-Array von vorne (wobei Du uns eh noch nicht verraten hast, welche Datenstrukturen Du für welche Schritte verwendest), wenn Du die erste 1 findest, setzt Du direkt danach das Komma und berechenst den Exponenten aus der vorherigen und der aktuellen Kommaposition. Darauf addierst Du deine Verschiebungskonstante.

    - dann die Binärzahl ins Hexasystem überführen

    Siehe oben.



  • Lernt man das nicht mehr in der Schule, 5. Klasse?

    Hab ja auch nichr behauptet das ich nicht weis wies geht, wusste nur nicht wie ich das in C umsetzen soll.
    Da ich eigentlich dachte das ich eine Zahl mit sprintf binär schon in den String schreiben könnte.

    Aber vielen Dank für die den Link mit der Funktion (klappt prima), habe mehrmals schon die Suche gewältzt aber irgendwie nix gefunden.
    Damit lässt sich auf jeden Fall arbeiten.

    mfg rendner


Anmelden zum Antworten