我注意到在制作一个程序时,很多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
类型,这样就无法隔离位第一名。
答案 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)