1

各ビットを個別に反復することなく、ビットセットからビットのCPUワードサイズの長いサブシーケンスを効率的に抽出する方法はありますか?何かのようなもの

#include <bitset>
#include <iostream>

using namespace std;

int main() {
        bitset<100> b;
        // Do something with b
        // ...

        // Now i want sizeof(long) many bits starting at position 50
        unsigned long l = (b>>50).to_ulong();
}

例外をスローする代わりにビット文字列を切り捨てる場合はそうします!

4

2 に答える 2

4

maskたとえば、次のように、下位Nビットのみが設定された定数ビットセットを作成できます。

bitset<100> const mask((unsigned long) -1);

((b >> 50) & mask).to_ulong()次に、ビットを抽出するために行うことができます。「単語」の定義がunsignedlongと同じでない場合は、別のマスクが必要になります。

(私はあなたの左シフトを右シフトに変更しました、それは私がよりうまくいくと信じています。)

十分に賢いコンパイラは、これを単なるシフトに変換して結果を読み取ることができます。実際に十分に賢いコンパイラがあるかどうかは疑問です。しかし、私はシフトのコストがとにかくのコストを上回っていると思います。

于 2011-06-04T15:46:46.780 に答える
0

コメントに関する新しい情報により、この回答は無関係になります。

答えには質問が必要です。ビットセットはどの基本データ型から作成されていますか?上記のビットセットが、符号なし文字のlsBからmsBの配列にlsbからmsbで格納されていると仮定すると、次のようになります。

1)ビットXを保持するバイトインデックスはX/8によって検出されます。

2)バイト(X / 8)のビットインデックスはX%8によって検出されます。

そのunsignedcharをX%8 -1左シフトすると、結果のunsigned longのlsbと次の8-X%8ビットが得られます。シフト演算子は単一のunsignedcharを操作したため、次の3つ(または4つ)のunsigned char)を補助のshort / longにコピーし、または-結果にコピーして、関連するビットを作成するためのコードがさらに必要になります。完全なunsignedlong。

于 2011-06-04T14:26:54.700 に答える