Структура данных для обработки больших двоичных данных

Привет коллеги программисты,

Я работаю над генетическим проектом, где эффективность скорости имеет решающее значение. По сути, мне нужно обработать много двоичных данных. Я работаю в C++11. У меня есть две функции, которые должны быть оптимизированы.

Во-первых, мне нужно иметь возможность использовать двоичные операторы между четырьмя двоичными строками, а затем проверять, все ли биты являются нулями.

т.е. (bitV1 & (bitV2^bitV3)| bitV4) == 0..0

Во-вторых, мне иногда нужно перевернуть определенные биты в определенном месте.

Моя проблема в том, что битовый набор должен знать размер во время компиляции, и я не знаю этот размер во время компиляции только во время выполнения. И, похоже, вектор не работает с бинарными операторами. Я мог бы перевести свои данные в массивы chars/string или int, а затем использовать операторы bitwises для них, но код не будет красивым.

Кто-нибудь знает эффективный и простой способ сделать это?

Вот MWE:

#include<iostream>
#include<bitset>
#include<vector>


int main() {
// I dont know the sizes for the sequences at compile time.
//std::bitset<intFromFile> firstBitset ("0011"); // doesnt compile

std::bitset<4> firstBitset ("0011");
std::bitset<4> secondBitset ("0101");
std::bitset<4> resultBitset = firstBitset &secondBitset;
std::cout << resultBitset; //OK

std::vector<bool> firstVector  {0,0,1,1};
std::vector<bool> secondVector {0,1,0,1};
//std::vector<bool> result = firstVector^secondVector; //ERROR
std::vector<bool> result {0,0,0,1}; //  OK

for (unsigned short int i = 0 ; i < result.size(); ++i){
    std::cout << result.at(i);
}
std::cout << std::endl;

return 0;
}

0 ответов

Другие вопросы по тегам