gpt4 book ai didi

c - C 中的位域数组

转载 作者:太空狗 更新时间:2023-10-29 16:59:06 25 4
gpt4 key购买 nike

我在 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;
}

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

但是这样的编码有点太多了。

  1. 没有类似位域数组或任何其他解决方法的东西吗? (或)
  2. 在 C my_flags->bits_i 中是否有类似的东西,其中 i 将是循环中的计数器?

我知道默认情况下两者都不存在于 C 中。但是有没有其他方法可以达到同样的目的?

最佳答案

您可以使用具有匿名内部结构的 union (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;
};
};

例如,您可以这样使用:

union flags x = {0x42};

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

printf("\n");

并访问特定位:

x.bits8 = 1;
printf("%d\n", x.bits8);

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

关于c - C 中的位域数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26668073/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com