如何使用int作为int / bools数组?

时间:2010-02-26 01:56:08

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

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

分别访问每个
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类型,这样就无法隔离位第一名。

3 个答案:

答案 0 :(得分:4)

首先,请记住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 */
};

值得注意的是,虽然你不需要那么多存储就可以获得,但是你输了,因为访问所有内容变得更加昂贵,因为现在每个读或写都有一堆与它相关的小麻烦机制。鉴于存储空间很便宜,可能不值得。

编辑:您还可以使用vector<bool>存储1位布尔值;但请注意它,因为它不像普通的vector!特别是,它不提供迭代器。这是完全不同的,公平地说vector<bool>实际上不是vector。 Scott Meyers在'Effective STL'中非常清楚地写了这个主题。

答案 1 :(得分:2)

在C中,为了节省空间,您可以将无符号短语重新解释为具有bitfields的结构(或使用此类结构而不会弄乱重新解释):

#include <stdio.h>

typedef struct bf_
{
   unsigned  x : 4;
   unsigned  y : 4;
   unsigned  z : 4;
   unsigned  w : 4;
} bf;


int main(void)
{
   unsigned short i = 5;
   bf *bitfields = (bf *) &i;

   bitfields->w = 12;
   printf("%d\n", bitfields->x);
   // etc..

   return 0;
}

答案 2 :(得分:1)

这是一种非常常见的技术。您通常会分配较大基元类型的数组(例如,int或long),并具有一些抽象来处理映射。如果您正在使用OO语言,那么实际定义某种BitArray或SmartArray或类似的东西通常是一个好主意,并且要求获取索引的getVal()。重要的是确保隐藏内部表示的细节(例如,当您在平台之间移动时)。

话虽如此,大多数主流语言已经具备此功能 如果您只想要位,WikiPedia有一个很好的列表。 如果你想要多于一些,你仍然可以找到一些东西,或者用类似的界面自己实现它。查看Java BitSet以获取参考