gpt4 book ai didi

c++ - 逐位赋值

转载 作者:太空狗 更新时间:2023-10-29 21:07:30 26 4
gpt4 key购买 nike

如果我有这样的结构:

struct example
{
uint16_t bar:1;
uint16_t foo:1;
};

然后我有另一个 16 位变量:uint16_t value;

如果我想将“value”中的第一位分配给“example.bar”,并将值中的第二位分配给“example.foo”,我该怎么做?

编辑:

我尝试了以下方法:

typedef struct
{
unsigned short in_1_16;
unsigned short in_17_32;
unsigned short in_33_48;
} READSTR;

typedef struct
{
unsigned short chan_1_16;
unsigned short chan_17_32;
unsigned short chan_33_48;
} TLM;

void main()
{
TLM tlm;
tlm.chan_1_16 = 0xFFFF;
READSTR t675;

t675.in_1_16 = 0x10;
t675.in_17_32 = 0x9;
t675.in_33_48 = 0x8;

tlm.chan_1_16 |= t675.in_1_16 & 1;
tlm.chan_1_16 |= t675.in_1_16 & (1 << 1);
tlm.chan_1_16 |= t675.in_1_16 & (1 << 2);
tlm.chan_1_16 |= t675.in_1_16 & (1 << 3);
tlm.chan_1_16 |= t675.in_1_16 & (1 << 4);
tlm.chan_1_16 |= t675.in_1_16 & (1 << 5);
tlm.chan_1_16 |= t675.in_1_16 & (1 << 6);
tlm.chan_1_16 |= t675.in_1_16 & (1 << 7);
tlm.chan_1_16 |= t675.in_1_16 & (1 << 8);
tlm.chan_1_16 |= t675.in_1_16 & (1 << 9);
tlm.chan_1_16 |= t675.in_1_16 & (1 << 10);
tlm.chan_1_16 |= t675.in_1_16 & (1 << 11);
tlm.chan_1_16 |= t675.in_1_16 & (1 << 12);
tlm.chan_1_16 |= t675.in_1_16 & (1 << 13);
tlm.chan_1_16 |= t675.in_1_16 & (1 << 14);
tlm.chan_1_16 |= t675.in_1_16 & (1 << 15);
printf("%x", tlm.chan_1_16);

因此,我将结构体中的值设置为全 1 (0xFFFF),并且我试图将它一点一点地设置为 0x10。但是当我运行这段代码时,我仍然得到 0xFFFF。不确定我做错了什么?

最佳答案

无法判断,因为标准中对位域的定义很差。以下是您无法知道的:

  • 位域 int 被视为有符号或无符号 int
  • 位顺序(lsb在哪里?)
  • 位域是否能超过CPU的内存对齐
  • 结构体非位域成员的对齐方式
  • 位字段的内存对齐(向左还是向右?)
  • 位域的字节顺序
  • 分配给它们的普通 int 值是被解释为有符号还是无符号
  • 整数提升如何隐式提升位域
  • 有符号位域是一个补码还是二进制补码
  • 填充字节的位置
  • 如何处理填充位
  • 填充位的值
  • 等等

正如您所希望的那样,位域非常非常糟糕,永远不应该使用。唯一明智的解决方案是重写没有位域的代码:

#define FOO 0x01U
#define BAR 0x02U

uint16_t value;

value |= FOO; /* set FOO bit */
value &= ~FOO; /* clear FOO bit */

以上代码可以在世界上任何系统的任何 C/C++ 编译器上执行,您将获得预期的结果。

关于c++ - 逐位赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4876221/

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