我正在寻找一个 C++ 位集实现,它可以回答是否在一个范围内设置了位。 std::bitset、vector和boost::dynamic_bitset都可以访问我可以循环的各个位,但这不是查询一系列位以询问是否设置了任何位的最有效方法——我没有甚至不需要知道是哪一个。
bitset b;
if(b.any(33, 199))
{
// ...
}
有没有提供这个的图书馆?我想针对其他实现(包括我可能必须编写的一个)运行一些基准测试,但我找不到任何似乎实现此功能的基准。
我正在寻找一个 C++ 位集实现,它可以回答是否在一个范围内设置了位。 std::bitset、vector和boost::dynamic_bitset都可以访问我可以循环的各个位,但这不是查询一系列位以询问是否设置了任何位的最有效方法——我没有甚至不需要知道是哪一个。
bitset b;
if(b.any(33, 199))
{
// ...
}
有没有提供这个的图书馆?我想针对其他实现(包括我可能必须编写的一个)运行一些基准测试,但我找不到任何似乎实现此功能的基准。
不幸的是,在 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.
要检查是否在 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
}
C++11 的 bitset 提供了您所追求的 any() 方法,但如果这不是一个选项,那么只需使用 b.to_ulong() 并检查非零。