std :: bitset上的bitscan(bsf)?或类似的

时间:2010-10-08 09:52:11

标签: c++ bitset

我正在做一个涉及解决一些NP难图问题的项目。特别是贝叶斯网络的三角剖分......

无论如何,我正在使用std :: bitset创建一个邻接矩阵,这非常好......但是我想用bsf指令扫描bitset。例如。 使用while循环。

有人知道这是否可行?

3 个答案:

答案 0 :(得分:4)

查看gcc 4.0.0附带的STL,bitset方法_Find_first_Find_next已经做了你想要的。具体来说,他们使用__builtin_ctzl()(描述here),它应该使用适当的指令。 (我猜这同样适用于旧版本的gcc。)

好的一点是bitset已经做了正确的事情:单指令,如果它是一个适合单个无符号长整数的bitset;如果它使用多个,那么就可以在多头上进行循环。在循环的情况下,它是一个循环,其长度在编译时已知,有一些指令,因此它可能由优化器完全展开。即滚动自己可能很难击败bitset。

答案 1 :(得分:1)

使用std::bitset::to_ulong然后使用BSF(你需要一个更大的32位的自定义contian,或者某种方式来获取每个32/64位的引用。

对于MSVC上的BSF,您可以使用_BitScanForward,否则您可以使用here

中的内容

您可能还希望使用BitMagic代替

答案 2 :(得分:0)

您可能会考虑查看BITSCAN C ++库以进行位数组操作,并Ugraph来管理位编码的无向图。由于这是我的代码,我不会在此添加其他评论。

希望它有所帮助! (如果确实如此,我会对任何反馈感兴趣)。