gpt4 book ai didi

c - 位域 VS。位掩码

转载 作者:行者123 更新时间:2023-12-04 12:17:17 25 4
gpt4 key购买 nike

我以前在 C 方面有过一些经验,但是我以前从未见过位域功能。我知道可以使用位掩码来隔离数据结构中的某些位,但是为什么还要使用位域呢?

例如,假设我们要隔离的位是前 3 个最低有效位。然后我们可以写:

/* our bitmasks */
#define FIELD_A (1 << 0)
#define FIELD_B (1 << 1)
#define FIELD_C (1 << 2)

int main(void)
{
/* the data structure that contains our three fields */
uint8_t flags;

/* accessing field A (as a boolean) */
int bool_a = !!(flags & FIELD_A);

/* accessing field B (as a boolean) */
int bool_b = !!(flags & FIELD_B);

/* accessing field C (as a boolean) */
int bool_c = !!(flags & FIELD_C);

return 0;
}

为什么我们会选择这样写:
static struct fields {
int field_a : 1;
int field_b : 1;
int field_c : 1;
};

int main(void)
{
/* the data structure that contains our three fields */
struct fields flags;

/* accessing field A */
int bit_a = flags.a;

/* accessing field B */
int bit_b = flags.b;

/* accessing field C */
int bit_c = flags.c;

return 0;
}

最佳答案

位域比显式位掩码更易于使用,尤其是对于长度大于 1 的情况。手动编码的位操作经常以微妙的方式被破坏。
位域的主要问题是不精确的规范:

  • 是否int类型位域有符号或无符号是实现定义的。
  • 内存中位域的顺序和位置是实现定义的,这使得硬件映射更具风险。即使对于给定的字节序,位域的位置和顺序也没有精确指定,这是一个主要缺点。

  • 特别注意 int field_a : 1;实际上是有问题的:一个 int具有单个位的位域可能读作 -1而不是 1如果设置。您应该使用 unsigned int field_a : 1;等等。

    关于c - 位域 VS。位掩码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56957720/

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