2012-02-29 10 views
2

C++のビットセットに関する2つの質問をします。C++ビットセットに関する質問

(1)関数引数から指定された長さのビットセットを作成するにはどうすればよいですか?私は例えば、私は

void f(int n) 

機能を持っており、fの内側に、私はbitset<n> bs;はなんとかこのものです作成する必要があり、意味ですか?

(2)ビットセットbsの一部をコピーして新しいビットセットを形成するにはどうすればよいですか?例えば、starting index i1及び> = i2i1は、私は(ちょうどSTL規則に適合するように)含めて少なくともi1番目の上位ビットに対して排他少なくともi2番目の上位ビットからbsにそれらのビットをコピーすることによって新しいビットセットを形成するために必要ending index i2を与え。

ありがとうございます。

+2

これらは、ドロイドビートセットではありません。驚いたことに、 'ベクトル'を探しています。 –

答えて

2

(1)サイズがコンパイル時定数(整数定数式)である必要があるため、std::bitsetで対応できません。あなたはstd::vector<bool>またはstd::vector<char>

(2)std::bitsetは、あなたが探しているもののための特別なコンストラクタをしない、あるいはboost::dynamic_bitset、または、使用することができます。明示的なループを記述する必要があります。しかし、(1)にリストされている他のオプションは、2つのイテレータを持つコンストラクタを持っています。

+0

'std :: vector 'を使うと、ビットセットの 'to_ulong()'がしているように便利にlongに変換する方法は? –

+0

@littleEinstein: 'boost :: dynamic_bitset'を使用してください。 'to_ulong'機能を持っています。 vectorを使用する場合は、自分でその機能を実装する必要があります。 –

+0

@littleEinstein 'std :: accumulate'を' unsigned long leftShiftAdd(unsigned long total、bool bit){total << 1; if(bit)total | = 1;総額を返す。 } '。 –

1

ブーストを使用できますか?もしそうなら、boost :: dynamic_bitsetが必要なものかもしれません。そうでなければstd::vector<bool>が機能するかもしれませんが、内部的にはboolのベクトルではなくビットセットとして格納されていますので、std :: copyを使用してビット範囲をコピーできるはずです。

0

最初の質問については、Boost.Dynamic Bitsetがあります。これはまさにあなたが望むものです。

2番目の質問について:ここでは、私は単純に(bs >> i2) & ~bitset(i1 - i2)になります。