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