boost :: dynamic_bitset <> заполняет в обратном порядке независимо от того, что - PullRequest
0 голосов
/ 02 декабря 2018

У меня огромный набор битов, представляющий все биты файла размером 74 МБ.Я использую алгоритм сжатия для создания сжатого строкового представления этого набора битов.Затем мне нужно сохранить эту строку в другой динамический набор битов, чтобы впоследствии ее можно было распаковать.Моя проблема в том, что независимо от того, как я пытаюсь заполнить набор битов из строки, он всегда заполняется в обратном порядке.

Для простоты, скажем, моя сжатая строка имеет вид

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 символов сжатой версии моего набора битов, сохраненной в виде строки.Эта строка сама по себе не имеет проблем.Подчеркнута красным линия, которую я использую для хранения этой строки в выходных данных boost :: dynamic_bitset.Затем я печатаю первые 6000 символов выходного набора битов, и они совершенно разные.Следует отметить, что битовый набор «output» передается в эту функцию в качестве ссылочного параметра, но изначально он пуст.Output

1 Ответ

0 голосов
/ 03 декабря 2018

За документация Конструктор std::string boost::dynamic_bitset назначит последний символ ввода младшему значащему биту, который будет битом с индексом 0.

Чтение обратно в цикле с растущим индексом даст исходную строку в обратном порядке.

Конструкторы из итераторов сделают что-то совершенно другое.Они интерпретируют каждый символ как целое число (код символа) и сохраняют двоичное представление для каждого целого числа в наборе битов.

Учитывая, что, например, оператор вывода потока для dynamic_bitset будет печатать набор битов, начиная сЯ думаю, нет проблем с его сохранением.Просто не забудьте учесть это, если вы используете петли.Однако, таких циклов, вероятно, следует избегать, так как доступ к отдельным битам будет медленнее, чем работа с целыми блоками хранения одновременно.Возможно, по этой же причине рекомендуется использовать собственный размер блока вместо unsigned char.

Если вам действительно нужно сохранить в другом порядке, сначала переверните строку:

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