我的问题如下:我有一个值x
和一个模式p
,两个变量的大小相同。目标是遍历 x 中未被p 屏蔽的所有位模式。
示例:如果我们有p = 1001
,我们希望找到0000
、0001
、1000
和1001
- 不一定按此顺序。
C99 中的标准实现(返回值指定我们是否已经返回所有值):
static bool next(size_t val, size_t mask, size_t *out) {
if (val == mask) {
return false;
}
size_t current = val & mask;
size_t inc = 1;
size_t new_val = current + inc;
while ((new_val & mask) <= current) {
inc++;
new_val = current + inc;
}
*out = new_val;
return true;
}
我认为应该有一些技巧可以提高效率,但我似乎找不到任何大的改进(除了计算掩码的尾随零和适当地设置 inc 的起始值,这不是一种提升)。
编辑:同样重要的是,对于每个生成的值,都会生成大量额外的工作,这意味着很多重复是不可能的(一些重复,即使无法识别也可以,没有任何副作用完成的工作,这只是一个减速)。