C中的Bit_fields数组

Rat*_*Don 8 c bit-fields

我在C中有一个8位的标志,我想使用这样的位字段逐位访问它:

#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;
}
Run Code Online (Sandbox Code Playgroud)

我得到了预期的输出:0 0 0 0 0 1 1 0.

但这有点太多编码.

  1. 是不是像位字段数组或任何其他解决方法?(要么)
  2. 在C my_flags->bits_i中有什么类似的东西,i它将成为循环中的计数器吗?

我知道默认情况下两者都不存在.但有没有其他方法可以实现相同的目标?

oua*_*uah 13

您可以使用具有匿名内部结构的联合(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;
    };
};
Run Code Online (Sandbox Code Playgroud)

你可以这样使用:

union flags x = {0x42};

for (i = CHAR_BIT - 1; i >= 0; i--)
{
    printf("%d\t", (x.u >> i) & 1);
}

printf("\n");
Run Code Online (Sandbox Code Playgroud)

并访问特定位:

x.bits8 = 1;
printf("%d\n", x.bits8);
Run Code Online (Sandbox Code Playgroud)

匿名内部结构也允许作为C89和C99的GNU扩展.

  • @RatDon它是两个成员之间的联合:`unsigned char`和匿名结构.匿名结构允许您直接从union对象访问其成员,例如在我的答案中:`x.bits8`. (3认同)

Rak*_*lik 6

  1. 不可以.您无法创建位域数组
  2. 您可以使用>>和提取每个位&

    int main() {
        int i, x=45;
        for(i=0; i<8; i++) {
            printf("%d", (x>>(7-i))&1);
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)