我清楚地理解了格雷码的目的。 EE Times: Gray Code Fundamentals
但我无法从概念上理解为什么可以生成灰色代码,如下所示
G i = B i + 1 ⊕B i ,i = n - 1 ,. 。 。 ,0,其中B n 取0。
有人可以从概念上帮助我。
答案 0 :(得分:1)
在标准二进制文件中,如果您使用n**2
进行异或或小于n**2-1
的数字,则可以有效地颠倒该计数的顺序:
x x^11
00 11
01 10
10 01
11 00
因此,对于一个两位数字,如果我们使用下一位的独占或底部位:
x x^(x>>1)
00 00
01 01
10 11
11 10
我们交替颠倒底部位的计数顺序,具体取决于它上面的位是置位还是清零。这确保了当位1改变时,位0保持不变(否则它将回绕到零并开始重新计数)。
对于在计数器顶部添加的每个位,我们需要重复下面位的计数反映,以确保在新位置位时它不会被清零。其余的位遵循相同的模式,由它们上方的位反映,使得它们向后计数而不是环绕。
答案 1 :(得分:0)
当您查看维基百科时,您会看到它是:
G0 = B0
Gi = Bi EXOR Gi-1
这更有意义吗? 检查一下你读过的页面中给出的Graycodes - 你会看到它存在。
您是否希望看到上述证据,或者正在查看示例?
答案 2 :(得分:0)
我发现Vovanium的answer对于理解生成格雷码序列的公式非常有帮助。这个想法是我们要生成一个序列,其中G(n + 1)仅从G(n)改变一位,即G(n + 1)x或G(n)仅设置1位。 Vovanium的答案部分复制在下面。
如果查看二进制计数序列,则会注意到,相邻代码在最后几个位(无孔)有所不同,因此,如果对它们进行异或运算,则会出现几个尾随1的模式。同样,当您右移数字时,xor也将右移:(A xor B)>> N == A >> N xor B >> N。
N N>>1 gray
0000 . 0000 . 0000 .
| >xor = 0001 >xor = 0000 >xor = 0001
0001 . 0000 . 0001 .
|| >xor = 0011 | >xor = 0001 >xor = 0010
0010 . 0001 . 0011 .
| >xor = 0001 >xor = 0000 >xor = 0001
0011 . 0001 . 0010 .
||| >xor = 0111 || >xor = 0011 >xor = 0100
0100 0010 0110
原始Xor结果和移位结果在单个位上有所不同(我在上面用点标记了它们)。这意味着,如果对它们进行异或运算,将获得设置了1位的模式。因此,
(A xor B) xor (A>>1 xor B>>1) == (A xor A>>1) xor (B xor B>>1) == gray (A) xor gray (B)