我的问题如下:我有一个值
例如:如果我们有
在 C99 中,标准实现如下(返回值指定是否已经返回了所有值):
我认为应该有一些技巧来使这个过程更有效率,但我似乎找不到什么大的改进(除了计算掩码的尾随零并适当设置inc的起始值,但这并不是很大的改进)。
编辑:还要注意的是,对于每个生成的值,都会产生大量额外的工作,这意味着许多重复是不可行的(一些重复,即使无法识别,也可以接受,没有任何副作用,只是减速)。
x
和一个模式 p
,两个变量的大小相同。目标是迭代通过 p 掩码没有覆盖的 x 的所有位模式。例如:如果我们有
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的起始值,但这并不是很大的改进)。
编辑:还要注意的是,对于每个生成的值,都会产生大量额外的工作,这意味着许多重复是不可行的(一些重复,即使无法识别,也可以接受,没有任何副作用,只是减速)。
p
适当地进行掩码处理,生成所有二进制数有什么问题? - user529758