在不使用任何外部计数器或其他状态的情况下,我正在寻找一个有效的函数,它采用 n 位值(32 位或左右)并以格雷码返回后续值。
那是:
int fn(int x)
{
int y = gray_to_binary(x);
y = y + 1;
return binary_to_gray(y);
}
但是,虽然binary_to_gray()
函数是微不足道的 ( x ^ (x >> 1)
),但对应的函数gray_to_binary()
一点也不微不足道(log(n)
迭代循环)。
也许有更有效的操作顺序?无论是标准反射格雷码,还是选择适合此问题的另一个格雷码。
另外: 我看到这个问题有两种可能的解决方案类型——一种是选择一个更容易转换为二进制的代码并使用上面给出的形式(或者演示一个更有效的反射代码到二进制的转换),以及另一种是完全推迟到二进制的转换,并产生一种在不使用二进制增量的情况下遍历格雷码的方法。
在后一种情况下,将生成的代码转换为二进制可能特别困难。实际上,这可能是不利的一面,但这仍然是一件有趣的事情。
更新: 由于有人指出格雷解码只是log(n)
操作(使用两种不同技术中的任何一种),我花了一些时间试图弄清楚这是否是对事情可以简化的严格限制。在确定要执行的下一个操作时,必须考虑所有位,否则“考虑”位将无法更改,并且函数将在两个值之间振荡。输入必须以某种方式压缩到可管理的规模,以确定下一个要执行的操作。
为了使其log(n-k)
操作,可以使用 2 k条目 LUT 来缩短最后的k
操作(评论建议k=32
)。
我想到的另一种通常可以非常快速地减少事物的技术是乘法和位掩码的组合。例如,计算奇偶校验以实现基于奇偶校验的算法。
从乘法和位掩码方法来看,似乎可能有空间发明格雷码,它可以进一步简化操作集......但我不认为有任何这样的代码是已知的。