在32或64位的一个字节中检测ascii char

问题描述 投票:2回答:1

当我想在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$!!!)这样的东西。

c null bit-manipulation byte ascii
1个回答
2
投票

它可以检测任何char,如果你以前用你的int xor它。

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

乘法将int分配给int的4个字节,xor清除char所在的字节。

© www.soinside.com 2019 - 2024. All rights reserved.