Union / Bitfeld



  • @ Herr-vorragend
    wir sind heir im ansi c forum !

    mfg



  • ouu, sorry, mein fehler 🙄



  • Nubian schrieb:

    hehe, stimmt! 🙂
    so weit hab ich dann wieder nich gedacht... 😞
    aber gibts nich auch nen einfachen weg zahlen binär darzustellen?
    mir ist so spontan nix eingefallen...

    sowas in der art?

    #define TYPE int
    #define BITS (sizeof(TYPE)*8)
    
    void f (TYPE x)
    {
        int s;
        for (s=0; s<BITS; s++)
        {
            if (x & 1<<(BITS-1))
                putchar ('1');
            else
                putchar ('0');
            x <<= 1;
        }
    }
    
    int main()
    {
        f (0xaaaa5555);
    }
    


  • Nubian schrieb:

    aber gibts nich auch nen einfachen weg zahlen binär darzustellen?
    mir ist so spontan nix eingefallen...

    Man kann char nehmen, das tut es oft. Ist zwar speicher verschwendung, dafür aber verdammt schnell beim zugriff

    ansonsten nimmt man "unsigned irgendwas" und shiftet immer selbst. so hat man perfekte speicher ausnutzung (ok, fast perfekte) aber der zugriff ist halt recht lahm.



  • net schrieb:

    sowas in der art?

    Jo, bis auf, dass es die daten nicht speichert 😉

    int bits = sizeof(TYPE) * 8;
    

    Lieber CHAR_BITS als 8 verwenden.



  • Shade Of Mine schrieb:

    Man kann char nehmen, das tut es oft. Ist zwar speicher verschwendung, dafür aber verdammt schnell beim zugriff

    ansonsten nimmt man "unsigned irgendwas" und shiftet immer selbst. so hat man perfekte speicher ausnutzung (ok, fast perfekte) aber der zugriff ist halt recht lahm.

    genau die beiden möglichkeiten sind mir auch eingefallen, aber ich dachte eigentlich dass es da noch was sinnvolleres gibt...
    naja, man kann halt nicht alles haben 😉

    @net:
    das sieht schon fein aus, werd ich mir merken 🙂



  • Nubian schrieb:

    ich dachte eigentlich dass es da noch was sinnvolleres gibt...
    naja, man kann halt nicht alles haben 😉

    Da man 1 bit nicht adressieren kann, schaut es da finster aus 😞



  • Shade Of Mine schrieb:

    so hat man perfekte speicher ausnutzung (ok, fast perfekte) aber der zugriff ist halt recht lahm.

    Ähmmm, warum ist der Zugriff bitte lahm?

    bzw. Was meinst du: Der maskierte Zugriff auf das integer oder das shiften selber? Das shiften selbst dürfte sehr schnell sein (ausser beim P4 vielleich).



  • TactX schrieb:

    Ähmmm, warum ist der Zugriff bitte lahm?

    Lahm im Vergleich zu dem char Array.
    Natuerlich ist der Zugriff recht schnell, aber eine pointer addition zu schlagen (die man bei einem char array ja hat) ist nahezu unmoeglich.

    das 'problem' hierbei ist, dass du dir das bit auch nicht wirklich merken kannst, dh, wenn du es setzt, liest und wieder setzt hast du 3 zugriffe - das ist natuerlich langsamer als einmal die addition bei dem char array und dann den speicher merken.

    natuerlich ist das nicht wirklich "lahm" aber im vergleich zu dem char array dennoch langsamer. und deshalb meistens nur dann sinnvoll, wenn der gesparte speicher etwas bringt. und das ist idr erst bei grossen zahlen der fall.



  • wenn ihr schon so wahnsinnig optimieren müsst, dann nehmt ein 'int'-array. damit sind die zugriffe noch ein tickchen schneller als bei 'char'


Anmelden zum Antworten