我需要定义一个结构,它具有大小为2位和6位的数据成员。我应该为每个成员使用char类型吗?或者,为了不浪费内存,我可以使用像:2\ :6这样的符号吗?我该怎么做呢?我能为2位或6位类型定义一个类型定义吗?
发布于 2013-01-30 17:06:11
您可以使用类似以下内容:
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可能并不适用于所有地方。
发布于 2013-01-30 17:06:08
对于这样的事情,最好使用uint8_t。是的,使用bit fields
struct tiny_fields
{
uint8_t twobits : 2;
uint8_t sixbits : 6;
}不过,我不认为您可以确定编译器会将其打包到单个字节中。此外,在结构类型的值所占用的字节中,您无法知道位是如何排序的。如果您想要更多的控制,使用显式掩码通常会更好。
发布于 2013-01-30 18:24:05
就我个人而言,我更喜欢移位运算符和一些宏,而不是位字段,所以编译器没有留下什么“魔力”。这是嵌入式世界中的常见做法。
#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 */https://stackoverflow.com/questions/14600153
复制相似问题