5

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

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

有没有提供这个的图书馆?我想针对其他实现(包括我可能必须编写的一个)运行一些基准测试,但我找不到任何似乎实现此功能的基准。

4

3 回答 3

1

不幸的是,在 C++11 bitset 中,仅通过指定范围的边界来将位范围设置为给定值是不可能的。迭代单个位似乎是我们能做的最多的事情。也无法检查范围内的所有位是否都设置为相同的值 (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.
于 2020-08-21T22:36:56.363 回答
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
}
于 2021-01-06T08:03:28.717 回答
-1

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

于 2013-10-10T05:21:32.557 回答