Манипулирование битовыми полями в C

Классическая проблема тестирования и установки отдельных битов в целое число в C, возможно, является одним из наиболее распространенных навыков программирования среднего уровня. Вы устанавливаете и тестируете с помощью простых битовых масок, таких как

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

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

интересное сообщение в блоге утверждает, что это подвержено ошибкам, трудно поддерживать и плохая практика. Сам язык C обеспечивает доступ на битовом уровне, который является безопасным и переносимым:

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

Но это делает меняcringe.

Интересный спор с моим коллегой по этому поводу до сих пор не решен. Оба стиля работают, и я считаю, что классический метод битовой маски прост, безопасен и понятен. Мой коллега соглашается, что это распространено и легко, но метод объединения битовых полей стоит дополнительных нескольких строк, чтобы сделать его переносимым и более безопасным.

Есть ли еще аргументы для любой из сторон? В частности, есть ли возможный сбой, возможно, с порядком байтов, который может пропустить метод битовой маски, но где метод структуры безопасен?

Ответы на вопрос(16)

Ваш ответ на вопрос