代码之家  ›  专栏  ›  技术社区  ›  Zebrafish

我能一次检查一小排喷杆吗?

  •  6
  • Zebrafish  · 技术社区  · 6 年前

    有一个相似的问题 here ,但该问题中的用户似乎有一个更大的数组或向量。如果我有:

    bool boolArray[4];
    

    我想检查所有元素是否都是假的,我可以分别检查[0]、[1]、[2]和[3],或者循环检查它。因为(据我所知)false的值应该是0,而0以外的任何值都是真的,所以我想简单地做:

    if ( *(int*) boolArray) { }
    

    这是可行的,但我意识到它依赖于bool是一个字节,int是四个字节。如果我投到(STD:UIT32),它会是好的,还是仍然是坏主意?我只是碰巧在一个数组中有3到4个bools,我想知道这是否安全,如果不安全,是否有更好的方法。

    另外,在我结束了超过4个布尔但小于8的情况下,我能用STD:UUT64 64 T或未签名的长long或其他什么来做同样的事情吗?

    3 回复  |  直到 6 年前
        1
  •  6
  •   Yksisarvinen    6 年前

    正如评论中所注意到的那样, std::bitset 可能是以无UB方式处理这一问题的最佳方式。

    std::bitset<4> boolArray {};
    if(boolArray.any()) {
        //do the thing
    }
    

    如果你想坚持使用数组,你可以使用 std::any_of ,但这需要(可能是读者特有的)使用函数,函数只返回其参数:

    bool boolArray[4];
    if(std::any_of(std::begin(boolArray), std::end(boolArray), [](bool b){return b;}) {
        //do the thing
    }
    

    夯实类型4 bool S to int 可能是个坏主意-您不能确定每种类型的大小。它可能适用于大多数架构,但是 STD::比特集 保证在任何情况下都能在任何地方工作。

        2
  •  2
  •   Jesper Juhl    6 年前
        3
  •  2
  •   Oblivion    6 年前

    你可以用 std::bitset<N>::any :

    有退货吗 true 如果任何位设置为_ ,否则 false .

    #include <iostream>      
    #include <bitset>        
    
    int main ()
    {
      std::bitset<4> foo;
      // modify foo here
    
    
      if (foo.any())
        std::cout << foo << " has " << foo.count() << " bits set.\n";
      else
        std::cout << foo << " has no bits set.\n";
    
      return 0;
    }
    

    Live

    如果你想回来 如果所有位或没有位设置为ON,则可以使用 std::bitset<N>::all std::bitset<N>::none 分别。