c++ - 如何将 int 用作 ints/bools 数组?

标签 c++ memory-management bitwise-operators integer

我在制作程序时注意到我的很多 int类型变量从未超过十个。我认为这是因为 int最短为 2 个字节(如果算上 char 则为 1 个字节),所以我应该能够存储 4 个 unsigned ints在一个 short int 中的最大值为 15,我知道我可以使用 >> 单独访问每个值和 << :

short unsigned int SLWD = 11434;
S is (SLWD >> 12), L is ((SLWD << 4) >> 12),
W is ((SLWD << 8) >> 12), and D is ((SLWD << 8) >> 12)

但是,我不知道如何将它包含在类的函数中,因为任何类型的 GetVal()函数必须是 int 类型,这首先违背了隔离位的目的。

最佳答案

首先,记住 Rules of Optimization .但这在 C 或 C++ 中使用位域是可能的:

struct mystruct {
    unsigned int smallint1 : 3; /* 3 bits wide, values  0 -- 7 */
    signed int   smallint2 : 4; /* 4 bits wide, values -8 -- 7 */
    unsigned int boolean   : 1; /* 1 bit  wide, values  0 -- 1 */
};

值得注意的是,虽然您因不需要那么多存储空间而获得 yield ,但您也有损失,因为访问所有内容的成本变得更高,因为现在每次读取或写入都有一堆与之相关的微调机制。鉴于存储很便宜,可能不值得。

编辑:您也可以使用 vector<bool>存储 1 位 bool 值;但要小心它,因为它不像普通的 vector !特别是,它不提供迭代器。它完全不同,可以公平地说 vector<bool>实际上不是 vector . Scott Meyers 在“Effective STL”中就此主题写得非常清楚。

关于c++ - 如何将 int 用作 ints/bools 数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2339027/

相关文章:

c++ - delete 和 delete[] 是如何实现的?

javascript - backbone.js 对不再使用的模型做了什么

javascript - 如何强制按位运算符产生无符号结果?

c - 为什么 C 有逻辑和按位 ‘or’ 运算符?

c++ - C中的这些声明有什么区别?

java - 如何通过 JNI 获取普通的一维数组而不是二维数组?

c++ - 为什么静态成员变量不能很好地与三元运算符一起使用?

c++ - 是否有用于标准化类型名称字符串格式的 C++ type_info 的可移植包装器?

jquery - 在 jQuery 中执行时,哪一行的效率更高(CPU/内存方面)?

java - 为什么这个加法代码(使用按位运算)在 java 中有效