如何存储大小为size的位数组,其中size % 8 != 0?

4

我使用一些数据,它表示为一系列位,其中数量(378)不可被8整除。

有哪些处理这种序列的可能方法?
我需要存储它,处理它,将一个序列附加到另一个序列上。

我考虑的选项:

  1. 向最近的% 8 == 0的数字四舍五入,并使用该大小的字符数组。
  2. 使用bitfield,据我所知,bitfield的内存对齐是实现定义的。

更新:
我正在处理以下位序列:
它是由给定单词使用Reed-Solomon编码算法生成的codeWord。
因此,将位视为独立值对我没有真正用处,我的主要关注点是如何存储codeWords并将新的codeWord附加到现有的codeWord中,以便减少突发错误的影响,我创建交错矩阵。


追加操作会经常出现吗?在处理中,您会对它们执行哪些查询? - harold
选项1听起来不错。你担心浪费内存吗?浪费的填充位只占用使用空间的约1.5%。 - samgak
2个回答

0

另一个选择是使用std::vector。bool类型的std::vector被专门设计为仅使用⌈v.size()/8⌉字节。但我并不是说你应该使用它。这种特殊化是v.begin()不仅仅是一个原始指针,而是某种类型相关迭代器的原因。在所有其他情况下,向量的v.begin()始终是元素的指针。

如果位数组的长度非常长,但您只希望设置很少的位,则还应考虑使用std::set<int>,它存储应为true的位的索引。


-1

在C++中,有几种表示位序列的方法。

其中一种适用于固定大小的序列,即 std::bitset

// Create array
std::bitset<378> bitArray;
// Access a bit
bitArray[14] = 1;
// Check whether a bit is set
if (bitArray.test(14))

如果您需要动态可调整大小的序列,可以考虑使用std::vector。如果存储空间大小很重要,并且一些访问时间开销并不重要,请考虑std::vector<bool>。根据标准,它将每个bool作为一个单独的位存储在一个紧密的数组中。
如果您不关心紧密打包,还可以定义自己的Bit枚举(或只使用char):
enum Bit : unsigned char
{
  Zero = 0, One = 1
}
std::vector<Bit> bitArray;

你能大致概述一下如何将一个位集附加到另一个位集上吗? - eerorika
@user2079303 std::bitset 有固定的大小:它是一个位数组。你需要自己编写这样的功能。 - Angew is no longer proud of SO
1
@user2079303 "连接 boost::dynamic_bitset 或 std::bitset" - HostileFork says dont trust SE
@Angew,感谢您的回复。对我来说,std::bitset是处理信息的众多可能方式之一,其中每个单独的位表示独立的值。重要的是我如何获得这些位的序列:它是使用Reed-Solomon编码算法从给定单词生成的codeWord。对我而言,更有价值的不是能够处理单个位,而是能够通过将每个后续序列附加到结果中来形成这样的序列数组。 - spin_eight
@spin_eight 对不起,我被你问题中给出的确切数字误导了,一开始没有注意到“追加”的部分。我扩展了答案,包括一些动态版本。 - Angew is no longer proud of SO

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接