Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 位阵列的快速检测与运算_C++_Arrays_Char_Bitarray_Bitwise And - Fatal编程技术网

C++ 位阵列的快速检测与运算

C++ 位阵列的快速检测与运算,c++,arrays,char,bitarray,bitwise-and,C++,Arrays,Char,Bitarray,Bitwise And,在大位阵列上执行按位AND运算的更快算法是什么?我用Car数组实现了C++中的位数组。现在,我迭代每个字节并执行and操作 void ANDoperation(char* A, char* B){ for (int i=0; i<(array_size/8 +1); i++ ){ A[i] &= B[i]; } } void和operation(char*A,char*B){ 对于(int i=0;i,如果您想采用更接近C++的方式,我建议您以以下方式使用: #包

在大位阵列上执行按位AND运算的更快算法是什么?我用Car数组实现了C++中的位数组。现在,我迭代每个字节并执行and操作

void ANDoperation(char* A, char* B){
  for (int i=0; i<(array_size/8 +1); i++ ){
    A[i] &= B[i];
  }
}
void和operation(char*A,char*B){

对于(int i=0;i,如果您想采用更接近C++的方式,我建议您以以下方式使用:

#包括
#包括
int main(){
std::位集v1(0b110);
std::位集v2(0b011);
v1&=v2;

std::cout关于“速度”和“效率”的要求是什么?这是一个主要的衡量标准(前两名)程序瓶颈?您是否在启用编译器优化的情况下进行了度量和基准测试?如果您知道数组已正确对齐,并且长度超过2或4个字节,则可以在
uint16\u t
uint32\u t
uint64\u t
(以更复杂的代码为代价)@有些程序员,是的。我尝试过O2优化。这是瓶颈。我的情况下的位数组大小是>10 ^ 6。<代码> O2可能不会打开矢量化。尝试<代码> O3,并考虑使指针受限。没有<代码>限制< /代码>,可以避免矢量化。对齐数组也可能是个好主意。rly用于矢量化(例如,AVX-512的64位边界)。这个问题可能与此相关:如何衡量它是一个瓶颈?10^6是一个非常小的数组。在这里比较这些版本:。您可以观察到,在第二种情况下,循环中的指令量最小(1个向量寄存器加载、1个和1个存储)。您没有指定
-O3
,因此没有进行优化。但即使进行优化,这也会导致非常糟糕的性能,因为
std::vector
是一种对位进行操作的专门化。只需检查输出程序集,您将看到没有进行矢量化演示链接(到Godbolt会话)显示编译器在编译时对和进行了计算。这里有一个更好的会话:位集的长度需要较大,否则编译器将在一条指令中处理整个数组。在我的示例中,我将长度设置为3000。生成的代码是一个循环,每次迭代处理64位。@AndrewBainbridge是的,你是对的。我将3仅作为一个例子,但将放3000。谢谢你,另外,“在你的情况下”可能会更好地作为“在安德鲁的情况下”,因为我们已经有两个评论。