我需要定义一个结构,它的数据成员大小为 2 位和 6 位。我应该char
为每个成员使用 type 吗?或者,为了不浪费内存,我可以使用:2
\ :6
notation 之类的东西吗?我怎样才能做到这一点?我可以为 2 位或 6 位类型定义 typedef 吗?
问问题
10528 次
3 回答
7
你可以使用类似的东西:
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-30T09:06:11.153 回答
5
最好uint8_t
用于这样的事情。是的,使用位字段:
struct tiny_fields
{
uint8_t twobits : 2;
uint8_t sixbits : 6;
}
不过,我认为您不能确定编译器会将其打包成一个字节。此外,在 struct 类型的值占用的字节内,您无法知道这些位是如何排序的。如果您想要更多控制权,通常最好使用显式掩码。
于 2013-01-30T09:06:08.267 回答
2
就我个人而言,我更喜欢移位运算符和一些宏而不是位字段,因此编译器没有“魔法”。这是嵌入式世界的惯例。
#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 */
于 2013-01-30T10:24:05.230 回答