同じ位置にある複数のビットセット内の発生数を1
と数えます。各位置のカウントはベクトルに格納されます。複数のstd :: bitset <N>で1の出現回数を最も速く計算する方法は?
など。
b0 = 1011
b1 = 1110
b2 = 0110
----
c = 2231 (1+1+0,0+1+1,1+1+1,1+0+0)
私は以下のコードで簡単にそれを行うことができますが、このコードでは、性能の不足に思えるが、私はよく分かりません。だから私の質問は簡単です:1
を数えるより速い方法はありますか?
#include <bitset>
#include <vector>
#include <iostream>
#include <string>
int main(int argc, char ** argv)
{
std::vector<std::bitset<4>> bitsets;
bitsets.push_back(std::bitset<4>("1011"));
bitsets.push_back(std::bitset<4>("1110"));
bitsets.push_back(std::bitset<4>("0110"));
std::vector<unsigned> counts;
for (int i=0,j=4; i<j; ++i)
{
counts.push_back(0);
for (int p=0,q=bitsets.size(); p<q; ++p)
{
if (bitsets[p][(4-1)-i]) // reverse order
{
counts[i] += 1;
}
}
}
for (auto const & count: counts)
{
std::cout << count << " ";
}
}
for (int i=0,j=4; i<j; ++i)
{
for (int p=0,q=b.size(); p<q; ++p)
{
if(b[p][i])
{
c[p] += 1;
}
}
}
このオンラインコンパイラ[リンク]を忘れました(https://ideone.com/c3pwLI) – user1587451
いくつかのこと:1.すべてのビットセットがコンパイル時の定数サイズを持つので、なぜ 'std :: array'ではなく' std :: vector'を使うのですか? 'std :: vector'が必要な場合は、' push_back'を使う代わりに正しいサイズで初期化します。 2. 2つのループを交換することで、おそらく少し速くなります(内側のループを外側のループにします)。これにより、同じメモリを複数回ロードする必要がなくなります。 – Holt
'std :: bitset <>'が本当に必要ですか?そうでない場合は、単純なcharを使用してその中にバイナリを入れて単純な低レベルのビット操作を行うのはなぜですか? – ckruczek