Float Binärdarstellung als int interpretieren??



  • den pointer zu deinem float auf einen int* casten und dann hast du quasi die binaerdarstellung als int.



  • Hallo,

    das mit dem reinterpret_cast funktioniert bei mir nicht. Ich bekomme immer die Fehlermeldung, daß ein float nicht in ein unsigned int* umgewandelt werden kann (geht auch nicht in ein unsigned int, int oder ein int* usw.).
    Muss ich noch irgendetwas extra einbinden?

    floriank



  • eine Zeile Code sagt mehr als 1000 worte.... Poste doch mal die Zeile wo Du versuchst float nach int zu casten...



  • reinterpret_cast klappt am besten mit Zeigern:

    float fval = 3.14f
    int* pival = reinterpret_cast<int*>(&fval);
    
    cout << fval <<"="<<*pival<<"("<<hex<<*pival<<")";
    

    (PS: Eventuell mußt du statt int short verwenden, um die richtige Größe zu treffen)



  • Vielen Dank.

    Ich hatte das "&" nicht mit geschrieben und deshalb hat es nicht funktioniert. Jetzt scheint es zu klappen.

    Ob es genau das macht, was ich möchte, werde ich sehen, wenn ich weiter gekommen bin.

    Danke nochmals
    floriank



  • Hallo,

    ich dachte, ich hätte es nun gelöst, aber anscheinend klappt es immer noch nicht.
    Also ich möchte folgendes machen. Ich habe einen float. Diesen möchte ich als unsigned int interpretieren und noch etwas an den Bits verändern:
    Falls dieser positiv ist, möchte ich das vorderste Bit umdrehen (also aus einer 0 eine 1 machen). Falls er negativ ist, möchte ich alles Bits umdrehen. Dadurch erreiche ich eine komplett sortierte Reihenfolge, wobei der kleinste Wert auch wirklich ganz unten steht und der größte oben (und -0 kommt direkt vor +0).
    Allerdings scheint es nicht so wirklich zu klappen.

    Hier ist mein Versuch:

    unsigned int* konvertierung(float original)
    {
    
    	unsigned int* o;
    	if (original > 0 )
    	{
    		original *= (-1) ;
    		o = reinterpret_cast<unsigned int*>(&original);
    		printf("%f    %u \n",original, o);
    	}
    	else
    	{
    		o = reinterpret_cast<unsigned int*>(&original);
    		o[0]=~o[0];
    	}
    
    	return(o);
    }
    

    Da ich momentan nur mit positiven Zahlen teste, habe ich mir auch nur diese ausgeben lassen.
    Leider bekomme ich beim unsigned int immer den gleichen Wert: 1244272.

    Kann mir dabei jemand helfen?

    Danke
    floriank



  • bist du dir sicher, dass es der wert, und nicht die adresse ist? bei so einer schrägen funktion muss man aber echt aufpassen, um die richtig anzuwenden^^



  • Andrey schrieb:

    bist du dir sicher, dass es der wert, und nicht die adresse ist? bei so einer schrägen funktion muss man aber echt aufpassen, um die richtig anzuwenden^^

    Danke für den Tipp. Es war die Adresse. Ich habe vergessen "*" vor meinen Zeiger bei der Ausgabe zu schreiben.



  • na siehste, geht doch 👍



  • Mit nem einfachen memcpy lässt kann man auch zur Bit-Darstellung kommen. Ich hatte mit diesem Cast unter bestimmten Umständen Probleme und bin dann zum memcpy übergegangen:

    float f_value = 234.34f;  
    unsigned long value = 0;  
    memcpy(&value, &f_value, sizeof(float));
    

    Gruß


Anmelden zum Antworten