发现数电书中对于格雷码并没有很好地解释,这里保留下来所理解的知识供自己日后查看。这里主要说明排列规律和转换。

格雷码特点:

任意两个相邻的代码只有一位二进制数不同。并且首尾相连,属于循环码(这里我发现百度有说不是的,特此注明)。

镜像排列规律:

如果要画卡诺图,镜像格雷码是必须的。生成二进制格雷码方式2的n次方位元的格雷码可以从n-1位元的格雷码以上下镜射后加上新位元的方式快速的得到,如图所示。

java格雷码构造问题 格雷码排序_数字信号处理


具体步骤:

  1. 写出 0, 1
  2. 在1的基础上,构造镜像0,1,1,0
  3. 在2的基础上,从上向下扩展最高位0,从下到上拓展最高位1,直至对称线两个相遇停止。这样就变成了00,01,11,10
  4. 在3的基础上,重复2,3步骤,得到000,001,011,010,110,111,101,100
  5. 按照上述方法不停拓展得到你需要的位数格雷码,即n位格雷码是基于n-1位格雷码产生的。

转换:

自然二进制转换为格雷码方法:

保留二进制码的最高位作为格雷码的最高位,而次高位格雷码为二进制码的高位与次高位相异或,而格雷码其余各位与次高位的求法相类似。

这里引用一张说明的很好的图片:

java格雷码构造问题 格雷码排序_java格雷码构造问题_02


格雷码转换为自然二进制码的方法:

保留格雷码的最高位作为自然二进制码的最高位,而次高位自然二进制码为高位自然二进制码与次高位格雷码相异或,而自然二进制码的其余各位与次高位自然二进制码的求法相类似。

同样给出图解,注意这里异或的对象由待转换数变成了转换结果中的数:

java格雷码构造问题 格雷码排序_维基百科_03

文章参考:

  • 维基百科格雷码:https://zh.wikipedia.org/zh-cn/%E6%A0%BC%E9%9B%B7%E7%A0%81