我的官方问题是:“是否有一种干净的方式来使用数据类型来”编码和压缩“数据,而不是使用凌乱的位掩码。”希望能够在压缩的情况下节省空间,并且我想使用本地数据类型,结构和数组来提高位掩码的可读性。我精通从我的程序集背景掩盖位,但我正在学习C++和OOP。我们可以通过使用单独的位将这么多信息存储在32位寄存器中,并且我觉得我正在尝试回到低级环境,同时具有C++代码的可读性。我可以使用像bool这样的数据类型来压缩数据,同时提高可读性吗?
我试图节省一些空间,因为我正在处理巨大的资源需求。我仍然在学习更多关于C++如何处理bool
数据类型的知识。我意识到内存是存储在字节块中而不是单个的位。我相信bool
通常使用一个字节并以某种方式被屏蔽。在我的脑海中,我可以在一个字节中使用8 bool
值。
如果我malloc在C++中的一个数组的2 bool
元素。它分配两个字节还是只分配一个字节?
示例:我们将使用DNA作为示例,因为它可以编码为两位来表示A,C,G和T.如果我用一个名为DNA_Base的两个bool
的数组构造一个结构体,那么我将创建一个数组其中20个。
struct DNA_Base{ bool Bit_1; bool Bit_2; };
DNA_Base DNA_Sequence[7] = {false};
cout << sizeof(DNA_Base)<<sizeof(DNA_Sequence)<<endl;
//Yields a 2 and a 14.
//I would like this to say 1 and 2.
在我的例子中,我还将展示DNA序列长度为20个碱基,需要40位编码的情况。 GATTACA最多只能占用2个字节?我想另外一个问题就是“如何让C++以更可读的方式为我掩饰”或者我应该创建自己的数据类型和类,并使用类和运算符重载实现位掩码。
'bool'实际上使用了一个完整的字节。除非使用按位联合或“std :: bitset”,否则不能真正处理内存中的一位。 – 2014-09-18 19:18:25
查看'std :: bitset'或错误名为'std :: vector'的方法来创建用于存储部分字节元素的伪容器。 –
Deduplicator
2014-09-18 19:19:48
它可能不是空间最优的,但使用'enum'或'enum class:char'来表示每个基地可能是最可读和最有效的表示。位字段通常应该避免。 – Jason 2014-09-18 19:38:20