質問: 0; i < NUM; i++) { flags |= hoge[i] << i; } return flags != 0; } ``` しかしこれでは、一応正常に動きはしますが「for文内で1だったら速攻true返せば早くね?」という話になってしまい、bitに直している意味が無いように感じてしまいます。 では、unsigned char配列を一括でbit列に直せる方法があれば良いのではとも考えましたが、そのような方法は私が調べた限りでは無いようで頓挫しています。 あいまいな言葉で申し訳ないのですが、もっとスマートな方法はありませんでしょうか。 よろしくお願いいたします。 余談ですがchar型が文字専用型ではないというのを最近知り「え!? ちがうのぉ!?」と驚愕しております。
回答: 「スマート」の定義がわかりませんが,まず前提として > > unsigned char配列を一括でbit列に直せる方法 > > > については,質問文で書かれているビットシフトと論理和を使う方法が最もシンプルかと思います. ただ,もしやりたいことが > > いづれかのフラグがたったらtrueを返す > > > であるなら,ビットシフトは必要ないように思います. ``` bool any() const { std::uint8_t flag = 0; for(std::size_t i = 0; i < NUM; ++i) { flag |= hoge[i]; } return flag != 0; } ``` > > for文内で1だったら速攻true返せば早くね? > > > については,最近のコンパイラは賢いのでうまいこと最適化してくれるかもしれませんが,ちょっと頭の悪い子だったりベクトル化が効く処理だったりすると,いちいち条件分岐する方が計算効率が悪くなり,「いっそ全部論理和をとってから最後に判定した方が早くね?」となる場合もあります. もっとも,他の回答者さんが言及しているように「最初から整数値1つでフラグ情報を持つ」あるいは「最初からbitsetを使う」方が楽ですが...