Manipulación de campo de bits en C

El problema clásico de probar y configurar bits individuales en un entero en C es quizás una de las habilidades de programación de nivel intermedio más comunes. Se configura y prueba con máscaras de bits simples como

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

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

Uninteresante entrada de blog sostiene que esto es propenso a errores, difícil de mantener y una mala práctica. El lenguaje C en sí mismo proporciona acceso a nivel de bits, que es seguro y portátil:

<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>

Pero esto me haceencogerse.

El interesante argumento que mi compañero de trabajo y yo tuvimos sobre esto aún no se ha resuelto. Ambos estilos funcionan, y mantengo que el método clásico de máscara de bits es fácil, seguro y claro. Mi compañero de trabajo está de acuerdo en que es común y fácil, pero el método de unión de campo de bits vale la pena por las pocas líneas adicionales para que sea portátil y más seguro.

¿Hay más argumentos para cualquier lado? En particular, ¿hay algún posible fallo, tal vez con endianness, que el método de máscara de bits pueda fallar pero donde el método de estructura es seguro?

Respuestas a la pregunta(17)

Su respuesta a la pregunta