如何查询是否在C ++ std :: bitset中设置了某个范围内的任何位?

时间:2013-10-10 02:35:22

标签: c++ bitset

我正在寻找一个C ++ bitset实现,如果在一个范围内设置了一个位,它可以回答。 std::bitsetvectorboost::dynamic_bitset都可以访问我可以循环的各个位,但这不是查询一系列位来询问是否任何位置位 - 我甚至不需要知道哪一个。

bitset b;
if(b.any(33, 199))
{
    // ...
}

是否有提供此功能的库?我想对其他实现(包括我可能要编写的实现)运行一些基准测试,但我找不到任何看似实现此功能的实现。

3 个答案:

答案 0 :(得分:1)

不幸的是,在C ++ 11位集中,无法仅通过指定范围的边界将位的范围设置为给定值。迭代单个位似乎是我们最大的能力。也无法检查范围内的所有位是否都设置为相同的值(1,0)。

Git中有一个开源项目,它提供了支持这些操作的BitSet(RangedBitset)的替代实现。它在内部使用任何大小的uint_64t_个单词数组,但也可以处理以单个位的精度指定的范围。在那里您可以做类似的事情

 a.set(4, 8, true); // set the range [ 4 .. 8 [ to true
 bool is_all_range = a.check(2, 6, true); // check if all range is set to 1.

答案 1 :(得分:0)

要检查是否在 bitset 中的 [x,y] 范围内设置了某个位,您可以使用 bs._Find_next(x-1)。它返回位置 x-1 之后的下一个设置位。 然后你可以检查返回的值是否<=y。

bool Find_if_bitset_has_any_set_bit_in_range(bitset<M> &bs, int x, int y){
   if(bs._Find_next(x-1)<=y)   return 1;   //TRUE
   return 0;                               //FALSE
}

答案 2 :(得分:-1)

C ++ 11的bitset提供了你所追求的any()方法,但如果这不是一个选项,那么只需使用b.to_ulong()并检查非零。