2010-12-07 10 views
3

uint32アレイのビットを設定して取得するための超高速機能を開発しようとしています。たとえば、「ビット1035を1に設定する」と言うことができます。次に、1035/32で索引されたuint32がビット位置1035%32で使用されます。特にsetbit関数の分岐が気に入らない。ここでビットを設定して取得する最速の方法

は私のアプローチです:

void SetBit(uint32* data, const uint32 bitpos, const bool newval) 
{ 
    if (newval) 
    { 
     //Set On 
     data[bitpos >> 5u] |= (1u << (31u - (bitpos & 31u))); 
     return; 
    } 
    else 
    { 
     //Set Off 
     data[bitpos >> 5u] &= ~(1u << (31u - (bitpos & 31u))); 
     return; 
    } 
} 

bool GetBit(const uint32* data, const uint32 bitpos) 
{ 
    return (data[bitpos >> 5u] >> (31u - (bitpos & 31u))) & 1u; 
} 

ありがとうございました!

+1

?何語?コンパイラの出力は今何ですか?すでにかなり早いことがわかるかもしれません。 –

+0

x86(32ビット)です。確かに、それはすでにかなり速いですが、私は思っています - 特にsetbit関数では、私はまだもっと速いかもしれません... – vls

+0

あなたのSetBitは本当にFlipBitですが、おそらくxorを使うことができるオペレーター)。 –

答えて

0

まず、私は31u - ...をすべての式から削除します。ビットセットのプライベート表現のビットを並べ替えるだけなので、誰も気づかずにこの順序を反転することができます。

第二には、あなたがclever bit hackを使って枝を取り除くことができます。

void SetBit(uint32* data, const uint32 bitpos, const bool f) 
{ 
    uint32 &w = data[bitpos >> 5u]; 
    uint32 m = 1u << (bitpos & 31u); 
    w = (w & ~m) | (-f & m); 
} 

第三に、あなたはコンパイラをさせることで、あなたのゲッターを簡素化することができます変換を行います。

何アーキテクチャ
bool GetBit(const uint32* data, const uint32 bitpos) 
{ 
    return data[bitpos >> 5u] & (1u << (bitpos & 31u)); 
} 
関連する問題