清除kth
中每个boost::dynamic_bitset
位的最快方法是什么,可选择从偏移j
?
目前我正在做这个非常慢的(伪代码):
for (i = j; i < bitset.size(); i += k) {
bitset[i] = 0;
}
必须完成数以百万计的清除工作,这就是为什么我正在寻找一种快速的方法来实现它。
答案 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)位移到左侧。
重复直到你完成。