Массив битовых полей в 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
,
Но это слишком много кода.
- Есть ли что-то вроде массива битовых полей или какого-либо другого обходного пути для этого? (или же)
- Есть ли что-нибудь подобное в 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.
- Вы не можете создать массив битовых полей
Вы можете извлечь каждый бит, используя
>>
а также&
int main() { int i, x=45; for(i=0; i<8; i++) { printf("%d", (x>>(7-i))&1); } }