我正在做一个涉及解决一些NP难图问题的项目。特别是贝叶斯网络的三角剖分......
无论如何,我正在使用std :: bitset创建一个邻接矩阵,这非常好......但是我想用bsf指令扫描bitset。例如。 不使用while循环。
有人知道这是否可行?
答案 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)