我有三个大的任意稀疏 bool vector ,它们的大小都相同 - 比如:pool1
, pool2
, intersection_of_other_pools
.我有兴趣执行按位运算符。如果我能做到那就太好了:intersection_of_other_pools |= pool1 | pool2
,但据我所知,这似乎不是一个选择。
由于所有这些 vector 的大小都非常大,而且 pool1
和 pool2
非常稀疏,我会对一种不循环对这些 vector 执行按位运算的方法感兴趣。我了解 std::vector<bool>
的幕后实现只是一个位数组,这使我相信可以在不循环的情况下执行此操作。
我对以速度为名的奇怪的按位破解解决方案持开放态度。
当然,如果最快(或唯一)的方法就是循环,那么我也很乐意接受它作为答案。
我已经 checkout valarray作为 vector 的潜在替代品,但我无法判断它是在循环还是在进行一些神奇的按位运算。但理想情况下,我不想更改现有代码库。
最佳答案
不要使用 std::vector<bool>
或类似的稀疏数组。
真正的稀疏数组应该能够跳过大的部分。
将您的数据编码为 block header ,标明区域的长度(以字节为单位)。用length中全1表示“length字段的长度是原来的两倍长跟在后面”,递归。
所以 0xFF0100 说明后面有一个长度为 512 的 block 。 (您可以通过不允许 0 和 1-254 来做得更好,但这是舍入误差)。
“全 0”的交替 block 与混合的 1 和 0 的 block 。
不要直接读取区 block 头;使用 memcpy 对齐存储。
一旦你有了这个,你的 |
或 &
操作比按位操作更像是一个缝合。只有在两者都有非零 block 的极少数情况下,您才真正进行按位运算。
做完之后&
您可能想检查是否有任何非 0 区域实际上全部为 0。
这假定一个极其稀疏的位域。像,每几万个中设置一个位就是一个典型的例子。如果稀疏是指“十分之一”,那么只需使用 uint64_t
的 vector 即可什么的。
关于c++ - 两个大型稀疏 vector 上的按位运算符没有循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56656122/