两个ascii字符串中相同字符数量
https://lemire.me/blog/2021/05/21/counting-the-number-of-matching-characters-in-two-ascii-strings/
里面这段代码挺有意思的:
- xor_xy 是对x y进行异或,相同的bit就会被设置成为0,所以后面要取反
- 先检查每个字节的低7位是否完全相同,如果完全相同的话,+1那么就是最高bit变为了1
- 然后检查原来最高bit是否为1,然后做个&操作 (t0 & t1)
- 现在相同字节的最高bit都是1,然后其余bit全部都是0
- 这个 *0x0101010101010101 有意思,其实是把所有字节最高位的bit相加,放在了最高字节上
- 然后 >> 56 拿到这个最高字节,就是相同的字符数量
uint64_t matching_bytes_in_word(uint64_t x, uint64_t y) { uint64_t xor_xy = x ^ y; const uint64_t t0 = (~xor_xy & 0x7f7f7f7f7f7f7f7fllu) + 0x0101010101010101llu; const uint64_t t1 = (~xor_xy & 0x8080808080808080llu); uint64_t zeros = t0 & t1; return ((zeros >> 7) * 0x0101010101010101ULL) >> 56; }