当我想在C中更快地编码strlen
时(比字节检查字节检查的速度更快),我发现了此宏:
#define DETECTNULL(X) (((X) - 0x01010101) & ~(X) & 0x80808080)
此宏读取4个字节并返回(1),当它找到至少一个nul字节时。否则它将返回(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
($!!!
)之类的东西不起作用。
,如果您以前使用int。
#define DETECTCHAR(x,c) (DETECTNULL((x) ^ ((c)*0x01010101l) ))
乘法将char分布在int的4个字节中,XOR清除了存在char的字节。