我想过滤一个范围内的值的数字流

时间:2012-10-10 19:15:52

标签: c string

我有一个代码的关键部分,用于检查许多字符串中的每个字符,以确保它落在可接受的范围内。

有没有办法可以在没有分支的情况下执行这样的过滤?

...
int i, c;
int sl = strnlen(s, 1023);
for( i = 0; i < sl; i++ ) {
    c = s[i];
    if( c < 68 || c > 88 )
        return E_INVALID;
}
if( 0 == i )
    return E_INVALID;
... do something with s ...

我在考虑使用按位操作进行某种过滤是可能的,但实际上我看不出如何使这项工作。按位AND和95将范围调整到0-31,64-95。如果没有引入if测试,我就无法看到如何进步,从而产生了跳过分支空白的想法。

2 个答案:

答案 0 :(得分:1)

假设你的字符串是真正的无符号字符,而不是整数,你可能有一个256字节的不可接受字符的查找表,这将使你的测试if(table [s [i]]){return E_INVALID; }

然而,如果你想加速一个关键功能,你应该做更多更大的回报。首先,您可以完全跳过strnlen,并在0 char上终止循环。仅这一点可能会让你得到2分。接下来将循环展开10倍左右,这应该得到另一个因子2。

答案 1 :(得分:1)

可以使用按位运算进行过滤。尝试...

c & 68 & ~88;

对于超出边界的值,此值应始终返回零;对于边界内的值,应始终返回非零值。

订单也是必要的......

CHAR & LowerBound & ~UpperBound

翻转边界会导致错误的行为