6

を使用したいのですstd::bitset::allが、残念ながら私のコンパイラは C++11 より古いものです。私のすべてのビットstd::bitsetが設定されているかどうかをループでチェックすることにより、機能を模倣できることを知っています。

例えば、

template<std::size_t N>
bool
all(std::bitset<N> const &bs) {
  int hits(0), sz(bs.size());
  for(int i(0); i < sz; ++i) {
    hits += bs[i];
  }
  return hits == sz;
}

Q:

std::bitset::all上記の C++11 コンパイラよりも古い C++11 コンパイラの代替のより適切な実装はありますか?

4

5 に答える 5

7

countが と等しいかどうかを確認してくださいsize:

template<size_t N>
bool all_set(const std::bitset<N>& b) {
    return b.count() == b.size();
}
于 2014-11-13T13:38:16.813 に答える
5

ループを回避したいが、最大のパフォーマンスを気にしない場合は、次のように比較できますcount(sizeつまり、設定されたビット数がビット数と等しいかどうかを確認します)。

template<std::size_t N>
bool all(std::bitset<N> const &bs) {
    return bs.count() == bs.size();
}

欠点 (ただし、他の非ループ ソリューションやループを使用した実装と同じです) は、最初のビットが設定されていないときに早期に停止しないことです。それを利用したい場合は、ループを変更して早期に終了します (ちなみに、szそのままでは必要ありませんN)。

template<std::size_t N>
bool all(std::bitset<N> const &bs) {
    for (int i = 0; i < N; ++i)
        if (!bs[i]) return false;
    return true;
}
于 2014-11-13T13:41:44.427 に答える
2

を使用できますbs.count() == bs.size()

于 2014-11-13T13:41:52.463 に答える
1

もう 1 つの方法は、テンプレート メタプログラミングを使用して、以下の例のようにビットフィールドのビットをアンロールすることです。

template<std::size_t N, int M>
struct bitset_all_helper {
  static bool check(std::bitset<N> const &bs) { return bs[M] && bitset_all_helper<N, M - 1>::check(bs); }
};

template<std::size_t N>
struct bitset_all_helper<N, 0> {
  static bool check(std::bitset<N> const &bs) { return bs[0]; }
};

template<std::size_t N>
bool bitset_all(std::bitset<N> const &bs) { return bitset_all_helper<N, N - 1>::check(bs); }

ライブデモ

于 2014-11-13T14:03:54.107 に答える