【发布时间】:2014-09-18 19:14:30
【问题描述】:
我的官方问题是:“有没有一种干净的方法来使用数据类型来“编码和压缩”数据,而不是使用凌乱的位掩码。”希望是在压缩的情况下节省空间,我想使用本机数据类型、结构和数组来提高位掩码的可读性。我在汇编背景中精通位掩码,但我正在学习 C++ 和 OOP。我们可以通过使用单个位在 32 位寄存器中存储如此多的信息,我觉得我正试图回到那个低级环境,同时具有 C++ 代码的可读性。
我正在尝试节省一些空间,因为我需要处理大量资源。我仍在学习更多关于 c++ 如何处理 bool 数据类型的信息。我意识到内存存储在字节块中,而不是单个位中。我相信 bool 通常使用一个字节并且以某种方式被屏蔽。在我的脑海中,我可以在一个字节中使用 8 个 bool 值。
如果我在 C++ 中 malloc 一个包含 2 个 bool 元素的数组。它分配两个字节还是只分配一个?
示例:我们将使用 DNA 作为示例,因为它可以被编码为两位来表示 A、C、G 和 T。如果我创建一个包含两个 bool 的数组的结构,称为 DNA_Base,那么我将创建一个其中 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,否则您无法真正解决内存中的单个位。 -
查看
std::bitset或名为std::vector<bool>的错误,了解如何创建以部分字节存储元素的伪容器。 -
它可能不是空间最优的,但使用
enum或enum class :char来表示每个碱基可能是最易读和最有效的表示。通常应避免使用位域。
标签: c++ compression bigdata entropy dna-sequence