清除boost :: dynamic_bitset中每个第k位的最快方法

时间:2011-04-13 13:42:24

标签: c++ boost bitset

清除kth中每个boost::dynamic_bitset位的最快方法是什么,可选择从偏移j

目前我正在做这个非常慢的(伪代码):

for (i = j; i < bitset.size(); i += k) {
    bitset[i] = 0;
}

必须完成数以百万计的清除工作,这就是为什么我正在寻找一种快速的方法来实现它。

2 个答案:

答案 0 :(得分:1)

好吧,不确定这是否更快,但我认为你可以测试:

关键操作是掩码位组的构造,你应该有一个预先构造的掩码表(这将允许你将每k位复位到每32位[在我的平台上{ {1}}是32位])。然后昂贵的操作是构造一个与输入相同大小的完整掩码 - 如果它总是相同的大小,并且内存不是约束,你可以简单地为此构造一个查找表,然后它只是{{1这两个位集。

unsigned long

更新:好的,只是粗略测试一下,你可以在这里看到结果:http://www.ideone.com/ez3Oc,带有预先构造的面具,它可以快几乎+ 40%......

答案 1 :(得分:0)

对于非常大的位集,计算一个n位长的掩码(其中n是你的原始大小,例如x86_64为64),如Nim建议的那样,应用它。
如果您的原始长度不是k的倍数,则相应地移动它 因此,如果您的原始长度为10并且只想设置30位长位集的每3位,则需要3次传递:
前10位:0010010010
第二个10位:0100100100
最后10位:1001001001
因此,在应用每个掩码后,您需要将它(n%k)位移到左侧。

重复直到你完成。