2

我在编写程序时注意到,我的许多int类型变量从未超过 10。我认为因为 anint最短为 2 个字节(如果计算为 1 char),所以我应该能够unsigned ints在一个短整数中存储最大值为 15 的 4,并且我知道我可以使用>>and单独访问每个字节<<

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()函数都必须是 type int,这首先破坏了隔离位的目的。

4

3 回答 3

4

首先,记住优化规则。但这在 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!特别是,它不提供迭代器。完全不同的是,可以公平地说 avector<bool>实际上不是 a vector。Scott Meyers 在“Effective STL”中对这个话题写得很清楚。

于 2010-02-26T02:09:29.547 回答
2

在 C 中,仅出于节省空间的目的,您可以将 unsigned short 重新解释为具有位域的结构(或使用这种结构而不会弄乱重新解释):

#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;
}
于 2010-02-26T02:11:03.400 回答
1

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

话虽如此,大多数主流语言已经具备此功能。
如果您只想要位,维基百科有一个很好的列表。如果您想要的不仅仅是位,您仍然可以找到一些东西,或者使用类似的接口自己实现它。查看 Java BitSet 以供参考

于 2010-02-26T02:02:16.927 回答