Я размышлял (и поэтому ищу способ узнать это , а не лучшее решение ), если возможно получить массив битов в структуре.
Позвольте мне продемонстрировать на примере. Представьте себе такой код:
#include <stdio.h>
struct A
{
unsigned int bit0:1;
unsigned int bit1:1;
unsigned int bit2:1;
unsigned int bit3:1;
};
int main()
{
struct A a = {1, 0, 1, 1};
printf("%u\n", a.bit0);
printf("%u\n", a.bit1);
printf("%u\n", a.bit2);
printf("%u\n", a.bit3);
return 0;
}
В этом коде у нас есть 4 отдельных бита, упакованных в структуру. К ним можно обращаться по отдельности, оставляя компилятору работу по битовым манипуляциям. Мне было интересно, возможно ли такое:
#include <stdio.h>
typedef unsigned int bit:1;
struct B
{
bit bits[4];
};
int main()
{
struct B b = {{1, 0, 1, 1}};
for (i = 0; i < 4; ++i)
printf("%u\n", b.bits[i]);
return 0;
}
Я пытался объявить bits
в struct B
как unsigned int bits[4]:1
или unsigned int bits:1[4]
или подобные вещи безрезультатно. Мое лучшее предположение было typedef unsigned int bit:1;
и использовать bit
в качестве типа, но все еще не работает.
Мой вопрос: возможна ли такая вещь? Если да, то как? Если нет, то почему? 1-битный unsigned int является допустимым типом, так почему бы вам не получить его массив?
Опять же, я не хочу замены для этого, мне просто интересно, как такая вещь возможна.
P.S. Я отмечаю это как C ++, хотя код написан на C, потому что я предполагаю, что метод будет существовать на обоих языках. Если есть особый способ сделать это на C ++ (используя языковые конструкции, а не библиотеки), мне также было бы интересно узнать.
ОБНОВЛЕНИЕ: я полностью осознаю, что могу выполнять битовые операции самостоятельно. Я делал это тысячу раз в прошлом. Я НЕ заинтересован в ответе, который говорит использовать массив / вектор вместо этого и делать битовые манипуляции. Я только думаю, если ЭТОГО КОНСТРУКЦИИ возможно или нет, а не альтернатива.
Обновление: ответ для нетерпеливых (спасибо neagoegab):
вместо
typedef unsigned int bit:1;
Я мог бы использовать
typedef struct
{
unsigned int value:1;
} bit;
правильно используя #pragma pack