当我想用C编写更快的strlen
时(比逐字节检查的更快),我发现了这个宏:
#define DETECTNULL(X) (((X) - 0x01010101) & ~(X) & 0x80808080)
此宏读取4个字节,并在找到至少一个NUL字节时返回(1)。 否则返回(0)。
我想知道是否可以使用相同的技术来查找ascii表的任何字符(我不希望不使用逐字节循环)。
我尝试了很多组合,而我能做的就是:
// in this example I wanted to find a '#'
int32_t detectsharp(int32_t c) {
c = ~(c - 0x24242424) & ~c;
return ((c - 0x01010101) & ~c & 0x80808080);
}
但是它不适用于0x22222222
(""""
)或类似0x24212121
($!!!
)之类的东西。
答案 0 :(得分:2)
如果您以前用int对它进行异或,它可以检测任何字符。
#define DETECTCHAR(x,c) (DETECTNULL((x) ^ ((c)*0x01010101l) ))
乘法将char分布在int的4个字节中,而xor清除存在char的字节。