Массив битовых полей в C

У меня есть флаг в 8 битов в C, и я хочу получить к нему побитовый доступ, используя битовые поля, например:

#include <stdio.h>
#include <stdint.h>

int main(void) {
    struct flags{
        uint8_t bits1:1;
        uint8_t bits2:1;
        uint8_t bits3:1;
        uint8_t bits4:1;
        uint8_t bits5:1;
        uint8_t bits6:1;
        uint8_t bits7:1;
        uint8_t bits8:1;
    };
    struct flags *my_flags;
    uint8_t x=6,i;

    my_flags=(struct flags *)&x;
    printf("%u\t",my_flags->bits5);
    printf("%u\t",my_flags->bits6);
    printf("%u\t",my_flags->bits7);
    printf("%u\t",my_flags->bits8);
    printf("%u\t",my_flags->bits1);
    printf("%u\t",my_flags->bits2);
    printf("%u\t",my_flags->bits3);
    printf("%u\t",my_flags->bits4);
    return 0;
}

и я получаю ожидаемый результат: 0 0 0 0 0 1 1 0,

Но это слишком много кода.

  1. Есть ли что-то вроде массива битовых полей или какого-либо другого обходного пути для этого? (или же)
  2. Есть ли что-нибудь подобное в C my_flags->bits_i где i будет счетчик в цикле?

Я знаю, что оба не в Си по умолчанию. Но есть ли альтернативы для достижения того же?

2 ответа

Решение

Вы можете использовать объединение с анонимной внутренней структурой (C11):

union flags
{
    unsigned char u;
    struct
    {
        uint8_t bits1:1;
        uint8_t bits2:1;
        uint8_t bits3:1;
        uint8_t bits4:1;
        uint8_t bits5:1;
        uint8_t bits6:1;
        uint8_t bits7:1;
        uint8_t bits8:1;
    };
};

Что вы можете использовать, например, таким образом:

union flags x = {0x42};

for (i = CHAR_BIT - 1; i >= 0; i--)
{
    printf("%d\t", (x.u >> i) & 1);
}

printf("\n");

и для доступа к определенному биту:

x.bits8 = 1;
printf("%d\n", x.bits8);

Анонимная внутренняя структура также допускается как расширение GNU для C89 и C99.

  1. Вы не можете создать массив битовых полей
  2. Вы можете извлечь каждый бит, используя >> а также &

    int main() {
        int i, x=45;
        for(i=0; i<8; i++) {
            printf("%d", (x>>(7-i))&1);
        }
    }
    
Другие вопросы по тегам