2 位大小可变
2 bits size variable
>我需要定义一个结构,该结构具有大小为 2 位和 6 位的数据成员。我应该为每个成员使用char
类型吗?或者,为了不浪费内存,我可以使用类似 :2
\ :6
表示法的东西吗?我该怎么做?我可以为 2 位或 6 位类型定义 typedef 吗?
你可以使用如下的东西:
typedef struct {
unsigned char SixBits:6;
unsigned char TwoBits:2;
} tEightBits;
然后使用:
tEightBits eight;
eight.SixBits = 31;
eight.TwoBits = 3;
但是,说实话,除非您必须遵守应用程序外部的打包数据,或者您处于内存非常受限的情况,否则这种内存节省通常不值得。您会发现,如果代码不必一直使用按位和位移操作打包和解包数据,则代码会快得多。
还要记住,使用除 _Bool
、 signed int
或 unsigned int
以外的任何类型的内容都是实现的问题。具体来说,unsigned char
可能不适用于所有地方。
对于这样的事情,最好使用 uint8_t
。是的,使用位字段:
struct tiny_fields
{
uint8_t twobits : 2;
uint8_t sixbits : 6;
}
不过,我认为您不能确定编译器会将其打包到单个字节中。此外,您无法知道位在结构类型的值占用的字节内是如何排序的。如果您想要更多控制,通常最好使用显式掩码。
就个人而言,我更喜欢移位运算符和一些宏而不是位字段,因此编译器没有"魔力"。这是嵌入式世界的惯常做法。
#define SET_VAL2BIT(_var, _val) ( (_var) | ((_val) & 3) )
#define SET_VAL6BIT(_var, _val) ( (_var) | (((_val) & 63) << 2) )
#define GET_VAL2BIT(_var) ( (_val) & 3)
#define GET_VAL6BIT(_var) ( ((_var) >> 2) & 63 )
static uint8_t my_var;
<...>
SET_VAL2BIT(my_var, 1);
SET_VAL6BIT(my_var, 5);
int a = GET_VAL2BIT(my_var); /* a == 1 */
int b = GET_VAL6BIT(my_var); /* b == 5 */
相关文章:
- 没有找到相关文章