Я размышлял (и поэтому ищу способ узнать это, , а не лучшее решение ), можно ли получить массив битов в структуре.
Позвольте мне продемонстрировать на примере. Представьте себе такой код:
#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;
}
Я попытался объявить бит
в struct B
как unsigned int bits [4]: 1
или unsigned int bits: 1 [4]
или подобные вещи безрезультатно. Мое лучшее предположение заключалось в том, чтобы typedef unsigned int bit: 1;
и использовать бит
в качестве типа, но все равно не работает.
У меня вопрос, возможно ли такое? Если да, то как? Если нет, то почему? 1-битное целое число без знака - допустимый тип, так почему бы вам не получить его массив?
Опять же, мне не нужна замена для этого, мне просто интересно, как такое возможно .
P.S. Я помечу это как C ++, хотя код написан на C, потому что я предполагаю, что этот метод будет существовать на обоих языках.Если есть особый способ сделать это C ++ (с использованием языковых конструкций, а не библиотек), мне также было бы интересно узнать.
ОБНОВЛЕНИЕ: Я полностью осознаю, что могу выполнять битовые операции сам. Я делал это тысячу раз в прошлом. Меня НЕ интересует ответ, в котором говорится, что вместо этого используйте массив / вектор и выполняйте манипуляции с битами. Я только думаю, возможна ли ЭТА КОНСТРУКЦИЯ или нет, НЕ альтернатива.
Обновление: Ответ для нетерпеливых (спасибо neagoegab):
Вместо
typedef unsigned int bit:1;
я мог бы правильно использовать
typedef struct
{
unsigned int value:1;
} bit;
, используя #pragma pack