首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >2位大小变量

2位大小变量
EN

Stack Overflow用户
提问于 2013-01-30 17:04:23
回答 3查看 10.2K关注 0票数 5

我需要定义一个结构,它具有大小为2位和6位的数据成员。我应该为每个成员使用char类型吗?或者,为了不浪费内存,我可以使用像:2\ :6这样的符号吗?我该怎么做呢?我能为2位或6位类型定义一个类型定义吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-01-30 17:06:11

您可以使用类似以下内容:

代码语言:javascript
复制
typedef struct {
    unsigned char SixBits:6;
    unsigned char TwoBits:2;
} tEightBits;

然后使用:

代码语言:javascript
复制
tEightBits eight;
eight.SixBits = 31;
eight.TwoBits = 3;

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

还要记住,使用除_Boolsigned intunsigned int之外的任何类型都是实现的问题。具体地说,unsigned char可能并不适用于所有地方。

票数 7
EN

Stack Overflow用户

发布于 2013-01-30 17:06:08

对于这样的事情,最好使用uint8_t。是的,使用bit fields

代码语言:javascript
复制
struct tiny_fields
{
  uint8_t twobits : 2;
  uint8_t sixbits : 6;
}

不过,我不认为您可以确定编译器会将其打包到单个字节中。此外,在结构类型的值所占用的字节中,您无法知道位是如何排序的。如果您想要更多的控制,使用显式掩码通常会更好。

票数 5
EN

Stack Overflow用户

发布于 2013-01-30 18:24:05

就我个人而言,我更喜欢移位运算符和一些宏,而不是位字段,所以编译器没有留下什么“魔力”。这是嵌入式世界中的常见做法。

代码语言:javascript
复制
#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 */
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14600153

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档