格雷码的定义和证明

首先,很多人一开始接触到格雷码一定见过下表:

二进制 格雷码
0000 0000
0001 0001
0010 0011
0011 0010
0100 0110
0101 0111
0110 0101
0111 0100
1000 1100
1001 1101
1010 1111
1011 1110
1100 1010
1101 1011
1110 1001
1111 1000

但是,你们知道二进制和格雷码之间是存在公式转换关系的吗?

我们定义二进制数为x[n - 1:0],y[n - 1:0](这里采用的Verilog的表示法)

则y = x ^ (x >> 1) (这里采用的C/Verilog语言的异或/右移符号)

我们可以认为y[k] = x[k] ^ x[k + 1](定义x[n] = 0)

那么,对于这么一种定义,你是否“显然”觉得每一个二进制数对应的格雷码都不相同?或者进一步说,是否二进制数与格雷码之间一一对应的关系是“显然”的,我觉得未必,下面我们来证明二者的一一对应关系:

命题1:证明所有二进制数对应的格雷码都不同

我们定义二进制数为x与p,格雷码为y和q(位宽定义与上述一致)

y[k] = x[k] ^ x[k + 1]

q[k] = p[k] ^ p[k + 1]

若y = q,则可以推出y[n - 1] = q[n - 1],又知y[n] = q[n] = 0(假定定义),则可以推出x[n - 1] = p[n - 1],我们也知道y[n - 2] = q[n - 2],因此可以推出x[n - 2] ^ x[n - 1] = p[n - 2] ^ p[n - 1],我们刚才已经推出x[n - 1] = p[n - 1],因此可以推出x[n - 2] = p[n - 2],继续推下去,最终可以推出x[0] = p[0],因此x = p

我们这里证明的是“对于两个相同的格雷码而言,其对应二进制数都一致”,也就同时证明了其逆反命题的成立性“对于两个不一致的二进制数而言,其对应的格雷码都不一致”。

命题2:证明所有格雷码对应的二进制数都不同

我们定义二进制数为x与p,格雷码为y和q(位宽定义与上述一致)

y[k] = x[k] ^ x[k + 1]

q[k] = p[k] ^ p[k + 1]

若x = p,则可以很容易推出对于每一个k而言,y[k] = q[k],因此“对于两个相同的二进制数而言,其对应格雷码都一致”这一命题被证明,也就同时证明了其逆反命题的成立性“对于两个不一致的格雷码而言对应的二进制数都不同”。

由命题1与命题2,我们就可以推出:“二进制数与格雷码是一一对应的”。

我们大家都知道,格雷码一个最重要的特点是:相邻的两个格雷码其汉明距离只有1(所谓相邻是指格雷码对应的二进制数的绝对值之差为1,所谓汉明距离为1是指的两个格雷码只有一个二进制位不同)。

我们来证明这个问题:

我们定义二进制数为x与p,格雷码为y和q(位宽定义与上述一致),同时x = p + 1

y[k] = x[k] ^ x[k + 1]

q[k] = p[k] ^ p[k + 1]

我们将x分为两种情况:

1、x的最后一位为1,则此时x与p的格雷码为:

x x[n - 1] x[n - 2] ... x[1] 1
x >> 1 0 x[n - 1] ... x[2] x[1]
y 相同 相同 相同 相同 不同
p p[n - 1] p[n - 2] ... p[1] 0
p >> 1 0 p[n - 1] ... p[2] p[1]
q 相同 相同 相同 相同 不同

很显然,此时当k>=1时,x[k] = p[k],因此y[k] = q[k],只有y[0] != q[0],因此在这种情况下,相邻两个格雷码的汉明距离确实为1。

2、x的最后一位为0,则此时x与p的格雷码为:

x x[n - 1] x[n - 2] ... x[m] 1 0 0 ... 0
x >> 1 0 x[n - 1] ... x[m + 1] x[m] 1 0 ... 0
y 相同 相同 相同 相同 不同 1 0 ... 0
p p[n - 1] p[n - 2] ... p[m] 0 1 1 ... 1
p >> 1 0 p[n - 1] ... p[m + 1] p[m] 0 1 ... 1
q 相同 相同 相同 相同 不同 1 0 ... 0

很显然,此时当k>=m时,x[k] = p[k],因此y[k] = q[k],当k<m时,显然10...0减1等于01...1,从上述运算可以看出,对于y和q而言仅y[m - 1] != q[m - 1],因此在这种情况下,相邻两个格雷码的汉明距离确实为1。

综上所述,相邻的两个格雷码其汉明距离只有1。

点赞

发表评论

昵称和uid可以选填一个,填邮箱必填(留言回复后将会发邮件给你)
tips:输入uid可以快速获得你的昵称和头像

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据