Bitfeldmanipulation in C

Das klassische Problem des Testens und Setzens einzelner Bits in einer Ganzzahl in C ist vielleicht eine der häufigsten Programmierfähigkeiten auf mittlerer Ebene. Sie setzen und testen mit einfachen Bitmasken wie

<code>unsigned int mask = 1<<11;

if (value & mask) {....} // Test for the bit
value |= mask;    // set the bit
value &= ~mask;   // clear the bit
</code>

Eininteressanter Blogbeitrag argumentiert, dass dies fehleranfällig, schwierig zu warten und schlechte Praxis ist. Die Sprache C selbst bietet einen typsicheren und portablen Zugriff auf Bitebene:

<code>typedef unsigned int boolean_t;
#define FALSE 0
#define TRUE !FALSE
typedef union {
        struct {
                boolean_t user:1;
                boolean_t zero:1;
                boolean_t force:1;
                int :28;                /* unused */
                boolean_t compat:1;     /* bit 31 */
        };
        int raw;
} flags_t;

int
create_object(flags_t flags)
{
        boolean_t is_compat = flags.compat;

        if (is_compat)
                flags.force = FALSE;

        if (flags.force) {
                [...]
        }
        [...]
}
</code>

Aber das macht michkriechen.

Das interessante Argument, das mein Kollege und ich dazu hatten, ist immer noch ungelöst. Beide Stile funktionieren, und ich halte die klassische Bitmaskenmethode für einfach, sicher und klar. Mein Kollege ist der Meinung, dass es allgemein und einfach ist, aber die Bitfeld-Vereinigungsmethode ist die wenigen zusätzlichen Zeilen wert, um es portabel und sicherer zu machen.

Gibt es weitere Argumente für beide Seiten? Gibt es insbesondere einen möglichen Fehler, möglicherweise mit Endianness, den die Bitmaskenmethode möglicherweise übersieht, aber wo die Strukturmethode sicher ist?

Antworten auf die Frage(17)

Ihre Antwort auf die Frage