0

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

有什么方法可以在不分支的情况下执行这种过滤?

...
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 ...

我在想某种使用按位运算的过滤可能是可能的,但实际上我看不出如何使这项工作。按位与 95 将范围缩小到 0-31,64-95。如果不引入 if 测试,我无法看到如何进行,从而提出跳过分支空白的想法。

4

2 回答 2

1

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

但是,如果您试图加速关键功能,您应该做其他事情以获得更大的回报。首先,您可以完全跳过 strnlen,并在 0 字符上终止循环。仅此一项可能会让您获得 2 倍。接下来将循环展开 10 倍左右,这应该会获得另一个 2 倍。

于 2012-10-10T19:40:36.153 回答
1

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

c & 68 & ~88;

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

订单也是必须的.​​..

CHAR & LowerBound & ~UpperBound

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

于 2012-10-11T14:16:49.850 回答