当我在寻求比依次检查每个字节更快的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
($!!!
)的内容一起使用。
0x23232323
,然后尝试检测零字节,它应该可以工作。这应该可以检测到#符号。对于所有其他字符也是类似的。 - Ctxuint32_t
而不是int32_t
。 - chqrlie