以32或64位为一个字节检测ASCII字符

时间:2019-02-23 16:00:18

标签: c null bit-manipulation byte ascii

当我想用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$!!!)之类的东西。

1 个答案:

答案 0 :(得分:2)

如果您以前用int对它进行异或,它可以检测任何字符。

#define DETECTCHAR(x,c) (DETECTNULL((x) ^ ((c)*0x01010101l) ))

乘法将char分布在int的4个字节中,而xor清除存在char的字节。