__builtin_ffs(x)是gcc 内建函数,具体意义另查。 只提供简单代码,使用SSE2指令集,使用SIMD来加速字符串比较。
当然不一定是字符串比较,示例中的arr1和arr2也可以看成是其他类型的数据的一种封装。
最后,while循环里面输出的jj就是arr1和arr2中每一个字符相同的位置。
#include "hash_util.h"
#include <stdio.h>
#include <immintrin.h>
#include <assert.h>
#define bitScan(x) __builtin_ffs(x)
int main() {
char arr1[16] = "0123456789abcdef";
char arr2[16] = "0123456789abcxyz";
__m128i arr1_16B = _mm_load_si128((const __m128i*)arr1);
__m128i arr2_16B = _mm_load_si128((const __m128i*)arr2);
__m128i cmp_res = _mm_cmpeq_epi8(arr1_16B, arr2_16B);
int mask = _mm_movemask_epi8(cmp_res);
printf("mask = %d\n", mask);
while (mask) {
int jj = bitScan(mask)-1;
assert(arr1[jj] == arr2[jj]);
mask &= ~(0x1<<jj);
}
return 0;
}
|