32 位 8 位比较形成的 32 位汉明字符串

32-bit Hamming String formation from 32 8-bit comparisons

我正在对图像执行普查变换,每个像素进行 32 次比较。我可以高效地生成 0x0100010100010100... 的 256 位向量,其中每个 8 位对应于 0x00 或 0x01。该向量在下面标识为 'comparisons'。我需要折叠这个 256 位向量以生成 32 位汉明字符串。数组 'census' 是我存储 8 位比较的地方。请注意,此时我不关心汉明距离,我只对尽快生成字符串感兴趣。我有可用的 AVX2。我当前的代码:

uint8_t* census = (uint8_t*) _mm_malloc(sizeof(int)*8,32);

...

_mm256_storeu_si256((__m256i*) census, comparisons);

uint32_t hammingString = (uint32_t) (census[0] +
                                    (census[1] << 1)   +
                                    (census[2] << 2)   +
                                    ...
                                    (census[31] << 31));

这几乎正是 _mm256_movemask_epi8 的用途,除了它采用字节的最高位而不是最低有效位。所以只要先左移7就可以了。

或者,更改生成这些字节的方式,因为您可能将它们分别设为 0x00 或 0xFF 以表示 false 和 true,对吗?至少,通常比较会产生那种结果。