两个ascii字符串中相同字符数量

https://lemire.me/blog/2021/05/21/counting-the-number-of-matching-characters-in-two-ascii-strings/

里面这段代码挺有意思的:

  1. xor_xy 是对x y进行异或,相同的bit就会被设置成为0,所以后面要取反
  2. 先检查每个字节的低7位是否完全相同,如果完全相同的话,+1那么就是最高bit变为了1
  3. 然后检查原来最高bit是否为1,然后做个&操作 (t0 & t1)
  4. 现在相同字节的最高bit都是1,然后其余bit全部都是0
  5. 这个 *0x0101010101010101 有意思,其实是把所有字节最高位的bit相加,放在了最高字节上
  6. 然后 >> 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;
}