Bitfelder aus einem int ziehen



  • Hallo!

    Ich habe ein struct in dem ich bitfelder festlege, die bestimmte einstellungen speichern. Wie kann ich ein fertiges integer wieder in die einzelnen bits zerlegen?

    Konkret:

    typedef struct keks{
        std::uint32_t herstellerID;
        std::uint32_t schokostreusel : 6;
        std::uint32_t rund           : 1;
        std::uint32_t azehne         : 12;
        std::uint32_t tauchbar       : 1;
        std::uint32_t blablubb       : 12;
    } keks;
    

    Meanwhile in der main.cpp:

    void foo(uint32_t, Hersteller, uint32_t keksEinstellungen){
        keks uebergebenerKeks;
        uerbegebenerKeks.herstellerID = Hersteller;
        //und hier hakts dann... Wie krieg ich den rest da rein?
    }
    

  • Mod

    Wie krieg ich den rest da rein?

    So:

    keks.schokostreusel = keksEinstellungen % (1 << 6);
    keks.rund = (keksEinstellungen >>= 6) % 2;
    keks.azehne = (keksEinstellungen >>= 1) % (1 << 12);
    keks.tauchbar = (keksEinstellungen >>= 12) % 2;
    keks.blablubb = (keksEinstellungen >>= 1) % (1 << 12);
    

    Allerdings muss ich selbstverständlich die Frage stellen, wofür du das brauchst und warum die Daten in so einer Form vorliegen.



  • Arcoth schrieb:

    Wie krieg ich den rest da rein?

    So:

    keks.schokostreusel = keksEinstellungen;
    keks.rund = keksEinstellungen >>= 6;
    keks.azehne = keksEinstellungen >>= 1;
    keks.tauchbar = keksEinstellungen >>= 12;
    keks.blablubb = keksEinstellungen >>= 1;
    

    👍 dafür, dass du eine Lösung präsentierst. Die meisten hätten irgendwas mit union oder memcpy oder Schlimmerem hingekotzt.

    Freddy_Kay schrieb:

    Wie kann ich ein fertiges integer wieder in die einzelnen bits zerlegen?

    wieder hört sich so an als würdest du die Zahl aus dem Bitset bereits berechnen. Wie machst du das bzw wo kommt die Zahl her?

    Du hast auch gar nicht erwähnt welches Bitset-Element den höchsten Stellenwert haben soll.


  • Mod

    @Tyrrox: Die war nicht standardkonform - siehe Edit.

    Beispiel:

    #include <cstdint>
    
    struct keks
    {
    	std::uint32_t herstellerID;
    	std::uint32_t schokostreusel : 6;
    	std::uint32_t rund           : 1;
    	std::uint32_t azehne         : 12;
    	std::uint32_t tauchbar       : 1;
    	std::uint32_t blablubb       : 12;
    };
    
    #include <bitset>
    #include <iostream>
    
    int main()
    {
    	std::uint32_t keksEinstellungen = 0b11101101100110110111101011110101;
    
    	keks k;
    	k.schokostreusel = keksEinstellungen % (1 << 6);
    	k.rund = (keksEinstellungen >>= 6) % 2;
    	k.azehne = (keksEinstellungen >>= 1) % (1 << 12);
    	k.tauchbar = (keksEinstellungen >>= 12) % 2;
    	k.blablubb = (keksEinstellungen >>= 1) % (1 << 12);
    
    	std::cout << std::bitset<6>{k.schokostreusel} << '\n';
    	std::cout << std::bitset<1>{k.rund} << '\n';
    	std::cout << std::bitset<12>{k.azehne} << '\n';
    	std::cout << std::bitset<1>{k.tauchbar} << '\n';
    	std::cout << std::bitset<12>{k.blablubb} << '\n';
    }
    


  • Arcoth schrieb:

    Wie krieg ich den rest da rein?

    So:

    keks.schokostreusel = keksEinstellungen % (1 << 6);
    keks.rund = (keksEinstellungen >>= 6) % 2;
    keks.azehne = (keksEinstellungen >>= 1) % (1 << 12);
    keks.tauchbar = (keksEinstellungen >>= 12) % 2;
    keks.blablubb = (keksEinstellungen >>= 1) % (1 << 12);
    

    Allerdings muss ich selbstverständlich die Frage stellen, wofür du das brauchst und warum die Daten in so einer Form vorliegen.

    Eigentlich erhalte ich ein selbst definiertes Struct über einen TcpSocket. Dafür verwende ich Qt und da ich ein struct bekomme verwende ich QDataStream für die Serialisierung. Die structs sind bereits vorgegeben durch das Gerät was ich steuere, daher lässt sich die Struktur nicht anpassen.

    Was ich also tue ist die vollen 32 bit auszulesen und im nachhinein in meinem struct unterzubringen.

    Danke im übrigen 😉

    TyRoXx schrieb:

    Arcoth schrieb:

    Wie krieg ich den rest da rein?

    So:

    keks.schokostreusel = keksEinstellungen;
    keks.rund = keksEinstellungen >>= 6;
    keks.azehne = keksEinstellungen >>= 1;
    keks.tauchbar = keksEinstellungen >>= 12;
    keks.blablubb = keksEinstellungen >>= 1;
    

    👍 dafür, dass du eine Lösung präsentierst. Die meisten hätten irgendwas mit union oder memcpy oder Schlimmerem hingekotzt.

    Freddy_Kay schrieb:

    Wie kann ich ein fertiges integer wieder in die einzelnen bits zerlegen?

    wieder hört sich so an als würdest du die Zahl aus dem Bitset bereits berechnen. Wie machst du das bzw wo kommt die Zahl her?

    Du hast auch gar nicht erwähnt welches Bitset-Element den höchsten Stellenwert haben soll.

    Wow... hier ist einiges neu für mich. Wie gesagt erhalte ich das ganze aus einem Datastream. Ich sage wieder, weil ich das aus einem vollen 32 bit integer lese.

    Was hat das mit dem Stellenwert auf sich?


Log in to reply