我正在尝试编写一个 SWAR 比较相等操作,uint64_t
假装是uint8_t
. 根据 Hacker's Delight 和 Bit Twiddling Hacks 中的技术,我设法达到的最接近的结果如下:
uint64_t compare_eq (uint64_t x, uint64_t y) {
uint64_t xored = x ^ y;
uint64_t mask = 0x7F * 0x0101010101010101ULL;
uint64_t tmp = (xored & mask) + mask;
return ~(tmp | xored | mask);
}
但是,这会放入0x80
匹配的0x00
“车道”和不匹配的“车道”,而我想要匹配的“车道”和不0xFF
匹配0x00
的“车道”。是否可以在没有分支的情况下编写它?