2011-01-02 23 views
1

値を計算し、UInt32を返す高速ビットレベルルーチンがあります。この値を32ビットのintフィールドにSQL Serverに格納する必要があります。フィールドのサイズを増やしたいだけでなく、この関数の "bytes"をintフィールドに格納したいとします。Cでの最速のUInt32からintへの変換

一度に何百ものレコードが要求されるため、ループ内でUInt32をint型に変換するには最も速い方法が必要です。一番左のビットがUInt32に設定されている場合、intの符号ビットを設定する必要があります(または実際には何も "繰り返し可能"ですが、符号ビットがおそらく最も簡単です)。

つまり、UInt32の4バイトを32ビット整数の4バイトにしたいだけです。私はBitConverterクラスを使用することができますが、私はそれが最速の方法であるかどうかはわかりません。このようなチェックされないエリアでこれを行うには速いだろう:

UInt32 fld = 4292515959; 
unchecked { 
    return (int)fld; 
    // -2451337 
} 

私は逆の質問はここで尋ねてきた、と答えは、他の方法で行くのと同じであるかどうばかり思っていた参照してください。

Fastest way to cast int to UInt32 bitwise?

+0

同じことですが、C#を安全性チェックとともにCと考えることができます。したがって、unsigned intをintに型キャストしたい場合は、型キャストを使用してください。しかし、最初にチェックしないで、コンパイラにあなたの意図をチェックしないように指示します。そうしないと、コンパイラは、割り当てが互換性がないというエラーを発生させます。互換性がないため、値の忠実度が失われる可能性があります4292515959はもう同じではなく、マイナス2451337になります(コンピュータ科学者[xkcd 541]の観点では同じです)) –

+0

マイケルに感謝します。あなたがこれをコメントしていないのであれば、私はすぐに答えとして投票したでしょう。 – Flipster

答えて

3

未確認バージョン(unchecked((int)x)など)は、メソッド呼び出しがないため、最も速い方法です。私はより速い方法があるとは思わない。

ちなみに、UInt32は別の名前ですuint ...一方的な方法はパフォーマンスの点で別の方法と同じですので、実際に投稿したリンクと同じです。


編集:私は最初の手にcheckeduncheckedより速かった(となし、それが最適化とリリースビルドし、デバッグビルドではなかった)ベンチマークのインスタンスを観察覚えています。私はなぜそれが起こったのか分かりませんが、いずれにしても、オーバーフローチェックを回すことによって何かを測定できるとは思わないでください。

+0

Lambertに感謝します。ちょうど私が必要な安心。 – Flipster

関連する問題