gpt4 book ai didi

c++ - boost::dynamic_bitset<> 无论如何都以相反的顺序填充

转载 作者:太空宇宙 更新时间:2023-11-04 12:42:19 25 4
gpt4 key购买 nike

我有一个巨大的位集,代表一个 74MB 文件的所有位。我正在使用压缩算法来创建此位集的压缩字符串表示形式。然后我需要将该字符串存储到另一个动态位集中,以便以后可以解压缩。我的问题是,无论我如何尝试从字符串填充位集,它总是以相反的顺序填充。

为了简单起见,假设我的压缩字符串是

1110001101010111011101

这是我第一次尝试填充我的输出动态位集:

string compressed = 1110001101010111011101;
output = boost::dynamic_bitset<unsigned char> (compressed);

当我这样做时,我的位集变成了字符串的反转:

   1011101110101011000111

然后我尝试了这个:

output = boost::dynamic_bitset<unsigned char> (compressed.begin(), compressed.end());

我得到了完全相同的输出。接下来我尝试使用反向迭代器,我不知道这是怎么可能的,但它以完全相同的方式填充位集:

output = boost::dynamic_bitset<unsigned char> (compressed.rbegin(), compressed.rend());

我可以按照正确的顺序填充我的位集的唯一方法是这样做:

for(uint i = 0; i < compressed.size(); i++)
{
if(compressed[i] == '0')
output.push_back(false);
else output.push_back(true);
}

这会以正确的顺序填充我的输出位集,但是它比使用其他方法慢得多(我使用的字符串慢 30 秒)。我也可以使用 std::reverse 来反转字符串,然后填充位集,但这需要很多额外的时间。有什么方法可以按正常顺序使用字符串中的值有效地填充动态位集?我明白为什么它是反向填充的,但我没有使用我的位集来表示一个整数,我用它来存储文件中的数据,所以我需要它是有序的。然而,为什么使用反向迭代器会产生相同的输出是没有意义的。

编辑我已经截取了我的输出和代码的相关部分。压缩输出显示我的位集压缩版本的前 6000 个字符,存储为字符串。这个字符串本身没有问题。红色下划线是我用来将此字符串存储在 bitset boost::dynamic_bitset 输出中的行。然后,我打印输出位集的前 6000 个字符,它们完全不同。我应该注意到,“输出”位集作为引用参数传递到此函数中,但最初是空的。 Output

最佳答案

根据 documentation boost::dynamic_bitsetstd::string 构造函数会将输入的最后一个字符分配给最低有效位,这将是索引为 的位0

在索引增长的循环中读回它会以相反的顺序给出原始字符串。

迭代器的构造函数会做一些完全不同的事情。他们将每个字符解释为一个整数(字符代码),并将每个整数的二进制表示形式保存到位集中。

考虑到,例如dynamic_bitset 的流输出运算符将从最高有效位开始打印位集,我认为以这种方式存储它没有问题。如果您使用循环,请务必考虑它。但是,应该避免这种循环,因为单个位访问比同时处理整个存储 block 要慢。出于同样的原因,可能建议使用 native block 大小而不是 unsigned char

如果您确实需要以其他顺序存储,请先反转您的字符串:

std::reverse(compressed.begin(), compressed.end());

关于c++ - boost::dynamic_bitset<> 无论如何都以相反的顺序填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53584502/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com