0,1が格納されているunsigned char配列をbit列に直したい


フラグの管理用に0, 1が格納されているunsigned
char配列hogeがあるとして、この配列を元に「いづれかのフラグがたったらtrueを返す」様な関数をbit演算を駆使して作りたいと考えています。(bitを駆使したフラグ管理練習用なので「別にbit使わなくても...」は無しでお願いいたします)  
そこで、以下の様な関数を作成してみました。

[code]

    bool IsAnyFlag() const
    {
        unsigned int flags = 0;
        for (int i = 0; i < NUM; i++)
        {
            flags |= hoge[i] << i;
        }
        return flags != 0;
    }
    
[/code]

しかしこれでは、一応正常に動きはしますが「for文内で1だったら速攻true返せば早くね？」という話になってしまい、bitに直している意味が無いように感じてしまいます。

では、unsigned
char配列を一括でbit列に直せる方法があれば良いのではとも考えましたが、そのような方法は私が調べた限りでは無いようで頓挫しています。

あいまいな言葉で申し訳ないのですが、もっとスマートな方法はありませんでしょうか。  
よろしくお願いいたします。

余談ですがchar型が文字専用型ではないというのを最近知り「え！？ ちがうのぉ！？」と驚愕しております。




[`std::find`](https://cpprefjp.github.io/reference/algorithm/find.html)を使えば特定の値を検索することができます。見つからなかった場合は`last`が返されるのでそれと比較すればいいでしょう。

[code]

    bool IsAnyFlag() const {
        return std::find(hoge, hoge + NUM, 1) != hoge + NUM;
    }
    
[/code]

* * *

### もっとスマートな方法はありませんでしょうか。

素直なコードを記述すればコンパイラーは効率的な処理を生成してくれます。例えば上記コードをVisual
C++でコンパイルするとC言語の`memchr`関数に展開されます。

もちろん`memchr`関数は自身の責任範囲内で効率的な検索を行います。int32_tさんが「大きな整数型でまとめて読むと早くなるケースがあります」と書かれていますが、例えば[glibcのmemchr](https://github.com/lattera/glibc/blob/master/string/memchr.c)なんかもアラインメントを考慮しながら`unsigned
long int`を使うことで複数まとめて読み込んでいます。Visual
C++も32bitに関してはアセンブラ言語で記述されており複数まとめて読み込んでいました。

結局、特殊なコードを記述するよりも、標準ライブラリを活用しシンプルな記述をすることが効率的かと思います。

* * *

### `std::find`と`boost::find`の違いについて

[Boost](https://ja.wikipedia.org/wiki/Boost)は

> Boostは考案された新機能を標準化させる前の試験運用の場であるとも言える。

という位置づけですので、STLとBoostとで全く同じ機能を持つ場合もあれば、STLに取り込まれる際に変更される場合もあり、またSTLに取り込まれた後にBoost側で更に新機能を追加される場合もあったりとまちまちです。`std::find`と`boost::find`とが似ているのもそのためです。




[`std::find`](https://cpprefjp.github.io/reference/algorithm/find.html)を使えば特定の値を検索することができます。見つからなかった場合は`last`が返されるのでそれと比較すればいいでしょう。

[code]

    bool IsAnyFlag() const {
        return std::find(hoge, hoge + NUM, 1) != hoge + NUM;
    }
    
[/code]

* * *

### もっとスマートな方法はありませんでしょうか。

素直なコードを記述すればコンパイラーは効率的な処理を生成してくれます。例えば上記コードをVisual
C++でコンパイルするとC言語の`memchr`関数に展開されます。

もちろん`memchr`関数は自身の責任範囲内で効率的な検索を行います。int32_tさんが「大きな整数型でまとめて読むと早くなるケースがあります」と書かれていますが、例えば[glibcのmemchr](https://github.com/lattera/glibc/blob/master/string/memchr.c)なんかもアラインメントを考慮しながら`unsigned
long int`を使うことで複数まとめて読み込んでいます。Visual
C++も32bitに関してはアセンブラ言語で記述されており複数まとめて読み込んでいました。

結局、特殊なコードを記述するよりも、標準ライブラリを活用しシンプルな記述をすることが効率的かと思います。

* * *

### `std::find`と`boost::find`の違いについて

[Boost](https://ja.wikipedia.org/wiki/Boost)は

> Boostは考案された新機能を標準化させる前の試験運用の場であるとも言える。

という位置づけですので、STLとBoostとで全く同じ機能を持つ場合もあれば、STLに取り込まれる際に変更される場合もあり、またSTLに取り込まれた後にBoost側で更に新機能を追加される場合もあったりとまちまちです。`std::find`と`boost::find`とが似ているのもそのためです。

