Bitmuster von floats ausgeben



  • Hallo ihr lieben,
    ich habe ein Frage bzgl. des bitweisen Auslesens bzw. Manipulierens eines floats.
    Es ist doch eigentlich so, dass wenn ich das Bitmuster eines floats ausgeben möchte, dann kann ich das doch so machen, dass ich über einen Pointer mit vorangestelltem Indirektions-Operator byte für byte auslesen kann und dann eben denn Inhalt eines jeden Bytes über eine entsprechende Funktion in ein Bitmuster umrechne und die dann ausgebe. Aber es gibt doch einen Shift-Operator mit dem man bitweise arbeiten kann. Ist es möglich sich da von Bit zu Bit zu hangeln und die Bits step by step auszugeben?
    Wäre für einen Tip sehr dankbar! Vielleicht hat jemand sowas schonmal gemacht.

    MfG

    DanDanR


  • Mod

    Bits sind nur eine Abstraktion, der Computer arbeitet immer nur mit Bytes. Ob die elektrisch in 2-Zustands-Flipflops gespeichert sind oder von einem Affen in eine Schiefertafel gemeißelt werden ist egal, du kannst nur an den Wert des ganzen Bytes kommen. Insofern sind auch die ganzen Bitoperationen als reine Rechenoperationen auf diesen Bytes zu verstehen, nicht dass da irgendwie ein Bitpointer weitergeschoben werden würde. Um an das Bitmuster zu kommen, musst du also rechnen. Meistens beinhaltet diese Rechnung auch Bitschieberechenoperationen.



  • C++ stellt den std::bitset<> zur Verfügung, da kann man sich die Bitpopelei sparen - z.B. so:

    #include <iostream>
    #include <bitset>
    
    struct Bitmuster
    {
        explicit Bitmuster( float flt ) : m_x( flt ) {}
        friend std::ostream& operator<<( std::ostream& out, Bitmuster bm )
        {
            const char* p = reinterpret_cast< const char* >( &bm.m_x ); 
            for( int i=0; i < sizeof(bm.m_x); ++i, ++p )
                out << std::bitset<8>(*p);
            return out;
        }
    private:
        float m_x;
    };
    
    int main()
    {
        using namespace std;
        for( float f; cout << "Ein float bitte: ", cin >> f; )
            cout << f << " := " << Bitmuster(f) << endl;
        return 0;
    }
    

Anmelden zum Antworten