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 のビットごとの AND は、範囲を 0 ~ 31、64 ~ 95 にトリムします。if テストを導入せずに進行する方法がわかりません。分岐の無効をスキップするという考えをレンダリングします。

4

2 に答える 2

1

文字列が実際には int ではなく unsigned char であると仮定すると、許容できない文字の 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 に答える