2012-04-22 3 views
2

私は多くのコードを実行していますが、これを最適化したいと思います。それは次のようになります。高速双方向ビットシフト?

int exponent; 
uint32_t mantissa; 

if (exponent < 0) { 
    return mantissa << -exponent; 
} else { 
    return mantissa >> exponent; 
} 

それは目的だ、非常に明確である、それは右シフトすべきmantissaexponentが負になることができexponent場所で。

できるだけ早くこれをコード化する方法がありますか?

答えて

4

あります。つまり、ブランチのないものです。私はすべての状況で必然的に速いとは言いません。

int exponent; 
uint32_t mantissa; 

return (uint32_t)((uint64_t)mantissa << (32-exponent) >> 32); 
+0

他の興味深い情報がありますが、ここではmantissaは23ビットの整数で、指数の範囲は[-127、+128]です。 (はい、IEEE 754 :)。 – orlp

+0

+1:賢い。最大のネイティブタイプも64ビット長であるマシンでは、仮数がより大きい(64ビット)同様のトリックはないと思います。 –

0

"integer abs without branching"をご覧ください。この男には、あなたが望むものを含むビッグトリックの素晴らしいセットがあります。 'exponent'の変数型が決して変更されない場合は、sizeof(int)* CHAR_BIT 'を8で置き換える必要があります。

ところで、この特定のif文が分岐によるパフォーマンス上の問題であることを確認してください。私が意味することは、問題がどこか他の場所でデータのローカリティが貧弱である場合、ブランチを最適化することに意味がないことです。