質問
私は(今正確には33)以上の32ビットでビットフラグを使用する必要があります。私が試したとstdを見つける::ビットセットは、32ビット以上(ULONG)を処理しません。私はベクトルを使用する必要がありますか、仕事にビットセットにする方法はありますか?
私はブーストを使用することはできませんので、このプロジェクトでは、C ++ 98に制限されています。
感謝します。
編集ます:
私はこのような何かをしたいと思います:
const uint64 kBigNumber = 1LL << 33;
std::bitset<33> myBitSet;
...
switch(myBitSet) {
case kBigNumber:
// do something
...
}
解決
私はちょうど65ビットでstd::bitset
を再テストしてきましたし、私の32ビットLinux上で、それは罰金と期待通りに動作します。
顕著な例外は、任意の組のビットが変換中に切り捨てされる場合は、例外をスローto_ulong()
方法です。今、私はそれについて考えると、それはかなり明白です:切り捨てられたデータを得ることからアプリケーションを防ぐために他の方法がありません。そして、行動はもの文書化されています。
の編集のスイッチ付き/ケースに。なぜあなたはその後、std::bitset
必要なのでしょうか?それらを使用する - あなたのプラットフォームは明らかにすでに64ビットの数値をサポートしています。 std::bitset
は、静的メモリ割り当てを有する軽量ビットアレイのnoreferrer">
他のヒント
std::bitset
は、多かれ少なかれ、任意のサイズで動作するはずです - に基づいてビットセットを構築するコンストラクタがありますので、それは、そのように見えることができますが、それののないの通常(unsigned long型のサイズに制限しますunsigned long型のビット)。
それは動作しません場合は、それは名前だけで、かなりvector<bool>
だということを認識すべきであるにもかかわらず、vector
は、あなたのために有用である可能性がある - それは、のないの実際の容器(すなわち、doesnのです「T)は、通常のコンテナの要件に準拠しています。
でしょうが、あなたのために仕事をstd::vector<bool>
?それは合理的に高速であり、小さなフットプリントを持って、サイズを変更することができます。また、STLの一部です。
あなたはstrtoull
を使用して、ビットセットにto_stringにを使用して戻ってそれをひそかすることができます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ビットまで上記缶作業に注意してください。