首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >布尔位字段与逻辑位屏蔽或位移位- C++

布尔位字段与逻辑位屏蔽或位移位- C++
EN

Stack Overflow用户
提问于 2012-04-22 02:55:51
回答 3查看 4.8K关注 0票数 4

我有一系列的类,它们需要很多布尔型字段,大概在4-10之间。我希望不必为每个布尔值使用一个字节。我一直在研究位字段结构,比如:

代码语言:javascript
运行
复制
struct BooleanBitFields
    {
        bool b1:1;
        bool b2:1;
        bool b3:1;
        bool b4:1;
        bool b5:1;
        bool b6:1;
    };

但在做了一些研究后,我看到很多人说这会导致低效的内存访问,不值得节省内存。我想知道在这种情况下最好的方法是什么。我应该使用位字段,还是使用带有位掩码的字符(和或s)来存储8位?如果是第二种解决方案,位移位和使用逻辑哪个更好?

如果有人能评论一下他们会使用什么方法,以及为什么这真的会帮助我决定我应该走哪条路线。

提前感谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-04-22 03:06:31

由于台式机上的地址空间很大,32/64位布尔值的数组可能看起来很浪费,确实如此,但大多数开发人员并不关心(包括我在内)。在RAM受限的嵌入式控制器上,或者在访问驱动程序中的硬件时,请务必使用位域,否则..

除了R/W ease/speed之外,另一个问题是32位或64位布尔值比必须由多个逻辑操作操作的中间位更安全。

票数 1
EN

Stack Overflow用户

发布于 2012-04-22 03:04:46

使用int位数组(为您提供大量扩展空间,使用单个char没有任何优势),并使用掩码常量进行测试:

代码语言:javascript
运行
复制
#define BOOL_A 1
#define BOOL_B 1 << 1
#define BOOL_C 1 << 2
#define BOOL_D 1 << 3

/* Alternately: use const ints for encapsulation */    

// declare and set
int bitray = 0 | BOOL_B | BOOL_D;

// test
if (bitray & BOOL_B) cout << "Set!\n";
票数 1
EN

Stack Overflow用户

发布于 2012-04-22 03:10:04

位字段只是编译器的推荐字段。编译器可以随心所欲地实现它们。在嵌入式系统中,有些编译器可以保证1位到位的映射。其他编译器则不这样做。

我会使用一个常规的结构,就像你的一样,但是没有位字段。使它们成为无符号字符-最短的数据类型。如果您的IDE支持自动完成,该结构将使您在编辑时更容易访问它们。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10261983

复制
相关文章

相似问题

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