2 位大小可变

2 bits size variable

本文关键字:      更新时间:2023-10-16

>我需要定义一个结构,该结构具有大小为 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;

但是,说实话,除非您必须遵守应用程序外部的打包数据,或者您处于内存非常受限的情况,否则这种内存节省通常不值得。您会发现,如果代码不必一直使用按位和位移操作打包和解包数据,则代码会快得多。


还要记住,使用除 _Boolsigned intunsigned 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 */
相关文章:
  • 没有找到相关文章