gpt4 book ai didi

c++ - 我怎样才能让位域以正确的顺序排列我的位?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:40:46 25 4
gpt4 key购买 nike

首先,有问题的应用程序总是在同一个处理器上,编译器总是 gcc,所以我不担心位域不可移植。

gcc 布置位域,使得第一个列出的域对应于一个字节的最低有效位。所以下面的结构,a=0, b=1, c=1, d=1,你得到一个字节值 e0。

struct Bits {
unsigned int a:5;
unsigned int b:1;
unsigned int c:1;
unsigned int d:1;
} __attribute__((__packed__));

(实际上,这是C++,所以我说的是g++。)

现在假设我希望 a 是一个六位整数。

现在,我明白为什么这行不通了,但我编写了以下结构:

struct Bits2 {
unsigned int a:6;
unsigned int b:1;
unsigned int c:1;
unsigned int d:1;
} __attribute__((__packed__));

bcd设置为1,将a设置为0会导致以下两个字节数:

c0 01

这不是我想要的。我希望看到这个:

e0 00

有什么方法可以指定一个结构,该结构在第一个字节的最高有效位中具有三位,并且在第一个字节的五个最低有效位和第二个字节的最高有效位之间具有六位?

请注意,我无法控制这些位的布局位置:这是由其他人的界面定义的位布局。

最佳答案

(请注意,所有这些都是特定于 gcc 的评论 - 我很清楚位域的布局是实现定义的)。

不是在小端机器上:问题是在小端机器上,第二个字节的最高有效位不被认为与第一个字节的最低有效位“相邻”。

但是,您可以将位域与 ntohs() 函数组合:

union u_Bits2{
struct Bits2 {
uint16_t _padding:7;
uint16_t a:6;
uint16_t b:1;
uint16_t c:1;
uint16_t d:1;
} bits __attribute__((__packed__));
uint16_t word;
}

union u_Bits2 flags;
flags.word = ntohs(flag_bytes_from_network);

但是,我强烈建议您避免使用位域,而是使用移位和掩码。

关于c++ - 我怎样才能让位域以正确的顺序排列我的位?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2664778/

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