我有一个代码的关键部分,用于检查许多字符串中的每个字符,以确保它落在可接受的范围内。
有没有办法可以在没有分支的情况下执行这样的过滤?
...
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测试,我就无法看到如何进步,从而产生了跳过分支空白的想法。
答案 0 :(得分:1)
假设你的字符串是真正的无符号字符,而不是整数,你可能有一个256字节的不可接受字符的查找表,这将使你的测试if(table [s [i]]){return E_INVALID; }
然而,如果你想加速一个关键功能,你应该做更多更大的回报。首先,您可以完全跳过strnlen,并在0 char上终止循环。仅这一点可能会让你得到2分。接下来将循环展开10倍左右,这应该得到另一个因子2。
答案 1 :(得分:1)
可以使用按位运算进行过滤。尝试...
c & 68 & ~88;
对于超出边界的值,此值应始终返回零;对于边界内的值,应始终返回非零值。
订单也是必要的......
CHAR & LowerBound & ~UpperBound
翻转边界会导致错误的行为