Hexadezimal



  • Schnell mal eine Frage,
    wie kann man dezimal Werte wie zum Beispiel 0.5f als hexadezimal wert schreiben das Ergebnis ist 0.8 in hexadezimal aber wie wird das in C code geschrieben.

    Danke im Voraus



  • Wie sind denn Deine Überlegungen dazu?



  • hexadezimal Zahlen werden ja mit 0x... dargestellt.
    Und wie is es mit komma stellen?
    Vielleicht habe ich da etwas falsch verstanden.



  • Ab C99 gibt es für printf den Specifier %a bzw. %A für hexadezimale Gleitkommakonstanten.



  • hi,

    Ich glaub das hilft mir leider nicht weiter.

    Ich möchte eigentlich den float Wert in unsigned int umwandeln und dann als bitfield verwenden.
    Ist das möglich?

    Zum Beispiel:

    float 0.5f
    binäre 0.1

    das brauch ich dann als bitfield/bitset/bitarray



  • Also ich möchte das, was hier erklärt wird implementieren

    http://stackoverflow.com/questions/474007/floating-point-to-binary-valuec

    allerdings ohne bitset klasse



  • schreib doch erstmal eine kleine funktion, welche die binäre repräsentation eines z.b. unsigned int in der konsole anzeigt.
    wenn das klappt, kannst du sie dann mit wenigen zusätzlichen zeilen erweitern.

    void binview ( char* value, int nbytes );
    
    int main(void)
    {
        unsigned int test = 2;
        binview ( &test, sizeof(test));
    
        return 0;
    }
    


  • Ich möchte die binäre repräsentation eines float als uint bitfield.
    Und ehrlich gesagt, ich kenne mich nicht aus damit.
    Habt Ihr Vorschläge?



  • Ja. Du hast sogar schon welche bekommen. Nur: Fertige Lösungen gibt's hier nicht.



  • Es geht um float, das Ergebnis in dem link oben allerdings ohne bitset klasse.



  • Vergiss die floats erstmal. Kannst Du so eine Funktion schreiben, wie von Big Brother beschrieben?



  • Nein kann ich nicht.
    Ich bin mir auch nicht sicher, ob meine Frage hier richtig verstanden wurde.
    Ich habe zur Zeit folgendes

    float f = 0.5f;
    unsigned long dw = *reinterpret_cast<unsigned long*>(&f);
    std::bitset<sizeof(float)*CHAR_BIT> bits(dw);
    unsigned long ul = bits.to_ulong();
    unsigned int i = *reinterpret_cast<unsigned int*>(&ul);

    ich weiss nicht ob das Sinn macht, aber ich möchte den float wert in ein uint bitarray convertieren.
    Letztendlich möchte ich also ein uint haben und dann mit bitwise operatoren die einzelne bits zugreifen.



  • du kannst mit bitshifts und mit bitweisen operatoren auf die einzelnen bits zugreifen, dafür brauchst du kein uint array.



  • float f = 0.5;
    uint32_t = i;
    memcpy(&i,&f, sizeof(float));
    

    Bedenke das Fliesskommazahlen in einem bestimmten Format vorliegen.

    myame schrieb:

    http://stackoverflow.com/questions/474007/floating-point-to-binary-valuec

    Ich habe mir sagen lassen, der union-Trick ist nicht standardkonform.



  • Eine weitere Funktion benutzt diese Werte für die Berechnung von Morton Key etc. Das heisst das Ergebnis muss unbedingt unsigned int sein.



  • ok hat sich erledigt, ich habe die Lösung, danke



  • Ich möchte das verstehen

    knivil schrieb:

    float f = 0.5;
    uint32_t = i;
    memcpy(&i,&f, sizeof(float));
    

    Bedenke das Fliesskommazahlen in einem bestimmten Format vorliegen.

    myame schrieb:

    http://stackoverflow.com/questions/474007/floating-point-to-binary-valuec

    Ich habe mir sagen lassen, der union-Trick ist nicht standardkonform.

    was meinst du mit, unsigned long konvertierung, wie ich gemacht habe ist unfug oder?



  • Fließkommazahlen werden in Mantisse und Charakteristik gespeichert.

    Zudem glaube ich ist die Einteilung wieviel Bit Mantisse und Charakteristik und die Anordnung(Bigendian/Littleendian) nicht einheitlich.



  • Ja, danke. Was ich gemacht habe ist absolut unfug natürlich.
    Es ging eher darum, dass ich float werte (koordinaten) als binäre form haben sollte, als uint.

    So:
    float fx = 0.5, fy = 0.5, fz = 0.5;

    // Convert to fixed point number.
    unsigned int x = (unsigned int) (fx * 0x400);
    unsigned int y = (unsigned int) (fy * 0x400);
    unsigned int z = (unsigned int) (fz * 0x400);

    //Actually create morton key.
    x = (x | (x<<16)) & 0xff0000ff;
    x = (x | (x<< 8)) & 0x0300f00f;
    x = (x | (x<< 4)) & 0x030c30c3;
    x = (x | (x<< 2)) & 0x09249249;

    y = (y | (y<<16)) & 0xff0000ff;
    y = (y | (y<< 8)) & 0x0300f00f;
    y = (y | (y<< 4)) & 0x030c30c3;
    y = (y | (y<< 2)) & 0x09249249;

    z = (z | (z<<16)) & 0xff0000ff;
    z = (z | (z<< 8)) & 0x0300f00f;
    z = (z | (z<< 4)) & 0x030c30c3;
    z = (z | (z<< 2)) & 0x09249249;

    // Add sentinel bit and combine key.
    unsigned int key =(1<<30) + (z<<2) + (y<<1) + x;

    Ich verstehe diesen code aber nicht. Wie wird hier convertiert?
    Und was ist ein sentinel?
    Wie man sieht, ich kenne mich damit nicht aus. Kann das jemand klären
    oder wo kann ich das nachlesen?



  • myame schrieb:

    Ich verstehe diesen code aber nicht. Wie wird hier convertiert?

    Wenn du die Cast's hier meinst, die haben nichts mit der Binärdarstellung zu tun, sondern sind eine direkte wertmäßige Umrechnung (die unsigned-Variablen bekommen den float-Wert, wobei Nachkommastellen abgeschnitten werden).
    Was der Sinn hinter den Berechnungen ist, mußt du den fragen, der dir diesen Code geliefert hat.

    PS: Übrigens ist alles, womit der PC arbeitet, in "binärer Form" 😉 (der Rest ist eine Frage der Werte-Interpretation)


Anmelden zum Antworten