Как получить массив битов в структуре?

Я размышлял (и поэтому ищу способ узнать это, , а не лучшее решение ), можно ли получить массив битов в структуре.

Позвольте мне продемонстрировать на примере. Представьте себе такой код:

#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

27
задан Shahbaz 3 June 2012 в 15:06
поделиться