C++11 用于大型二进制数据操作的数据结构

C++11 用于大型二进制数据操作的数据结构,c++11,bit,genetics,C++11,Bit,Genetics,各位程序员好 我正在从事一个基因工程,在这个工程中,速度效率至关重要。我需要处理大量的二进制数据。我在c++11中工作。我有两个功能需要优化 首先,我需要能够在四个二进制字符串之间使用二进制运算符,然后检查所有位是否都是零 i、 e.(位v1&(位v2^位v3)|位v4)=0..0 第二,我有时需要在某个位置翻转某些位 我的问题是位集需要知道编译时的大小,而我不知道编译时的大小,只知道执行时的大小。向量似乎不适用于二进制运算符。我可以在chars/string或int数组中转换数据,然后在这些数

各位程序员好

我正在从事一个基因工程,在这个工程中,速度效率至关重要。我需要处理大量的二进制数据。我在c++11中工作。我有两个功能需要优化

首先,我需要能够在四个二进制字符串之间使用二进制运算符,然后检查所有位是否都是零

i、 e.(位v1&(位v2^位v3)|位v4)=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;
}
#包括
#包括
#包括
int main(){
//我不知道编译时序列的大小。
//std::bitset firstBitset(“0011”);//未编译
std::位集第一位集(“0011”);
std::位集第二位集(“0101”);
std::位集结果集=第一位集和第二位集;

std::cout在数千到数百万之间。如果您想要简单,其中一种方法是使用
std::valarray
,然后您可以直接使用位运算符(示例)。如果您希望它高效,那么我将在C和SIMD intrinsic中实现该操作,并使用
std::vector
作为容器,使用
boost::alignment::aligned_分配器,而不是默认分配器。我将使用Intel线程构建块来并行计算。我想要速度效率,所以您建议使用std::ve什么的运算符?对齐分配器的用途是什么?这取决于您希望如何对操作进行矢量化。如果您希望使用默认运算符,则可以使用
uint64\u t
\u int128
,这在一些流行的编译器上广泛可用。基本上,您需要支持按位运算符的最宽无符号整数类型但是,如果您决定不使用位运算符来编写操作,那么std::vector所需要的只是作为一个容器,而类型则无关紧要。分配器是为了帮助确保存储与某个边界对齐,以便SIMD代码更易于编写并运行得更快。不过,以上所有内容都使用SIMD模型。您可以LSO考虑多线程模型,使用OpenMP或其他东西。SIMD和多线程是非常独立的。最好的方法可能是“代码> STD::ValSux和OpenMP,并将矢量化留给编译器。如果OpenMP不足够,那么去手动对代码进行矢量化。