Структура данных для обработки больших двоичных данных
Привет коллеги программисты,
Я работаю над генетическим проектом, где эффективность скорости имеет решающее значение. По сути, мне нужно обработать много двоичных данных. Я работаю в 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;
}