4

32ビットを超えるビットフラグを使用する必要があります(現時点では正確には33ビット)。std :: bitsetが32ビット(長い)を超えて処理しないことを試しました。ベクトルを使用する必要がありますか、それともビットセットを機能させる方法がありますか?

このプロジェクトではc++98に制限されているため、ブーストを使用できません。

ありがとう。

編集:

私はこのようなことをしたいです:

const uint64    kBigNumber = 1LL << 33;
std::bitset<33> myBitSet;
...
switch(myBitSet) {
    case kBigNumber:
    // do something
    ...
}
4

4 に答える 4

6

std::bitset多かれ少なかれ任意のサイズで動作する必要があります-通常は unsigned long のサイズに制限されていません(ただし、unsigned long のビットに基づいてビットセットを構築するコンストラクターがあるため、そのように見える場合があります)。

それが機能しない場合は、vector<bool>役に立つかもしれませんが、これはほとんどvector名前だけであることに注意する必要があります。これは実際にはコンテナーではありません (つまり、通常のコンテナー要件に準拠していません)。

于 2010-08-31T15:24:46.547 に答える
5

あなたstd::vector<bool>のために働きますか?サイズを変更でき、適度に高速で、フットプリントが小さくなります。これはSTLの一部でもあります。

于 2010-08-31T15:19:22.447 に答える
4

65ビットで再テストstd::bitsetしたところ、32ビットLinuxでは正常に動作し、期待どおりに動作します。

注目すべき例外はto_ulong()、変換中に設定されたビットが切り捨てられる場合に例外をスローするメソッドです。今私はそれについて考えます、そしてそれはかなり明白です:アプリケーションが切り捨てられたデータを取得するのを防ぐ他の方法はありません。また、動作も文書化されています


スイッチ/ケースで編集します。なぜあなたはstd::bitsetそれが必要なのですか?あなたのプラットフォームは明らかにすでに64ビット数をサポートしています-それらを使用してください。静的メモリ割り当てを備えた軽量ビット配列std::bitsetとして使用するように設計されています。番号の代わりとして使用することを意図したものではありません。

于 2010-08-31T15:49:02.147 に答える
1

ビットセットで to_string を使用し、strtoull を使用して元に戻すことができます

const uint64    kBigNumber = 1LL << 33;
std::bitset<33> myBitSet;
...
unsigned long long bitSetLong = strtoull(myBitSet.to_string<char,char_traits<char>,allocator<char> >().c_str(), NULL, 2);
switch(bitSetLong) {
    case kBigNumber:
    // do something
    ...
}

上記は64ビットまでしか機能しないことに注意してください。

于 2010-08-31T16:30:21.003 に答える