# -*- coding: UTF-8 -*-
'''
方法1
假设原始的值从0开始,格雷码产生的规律是:第一步,改变最右边的位元值;第二步,改变右起第一个为1的位元的左边位元;第三步,第四步重复第一步和第二步,直到所有的格雷码产生完毕(换句话说,已经走了(2^n) - 1 步)。
方法2
递归产生
在实现的时候,我们完全可以利用递归,在每一层前面加上0或者1,然后就可以列出所有的格雷码。
比如:
第一步:产生 0, 1 两个字符串。
第二步:在第一步的基础上,每一个字符串都加上0和1,但是每次只能加一个,所以得做两次。这样就变成了 00,01,11,10 (注意对称)。
第三步:在第二步的基础上,再给每个字符串都加上0和1,同样,每次只能加一个,这样就变成了 000,001,011,010,110,111,101,100。
好了,这样就把3位元格雷码生成好了。
如果要生成4位元格雷码,我们只需要在3位元格雷码上再加一层0,1就可以
方法3
格雷码还有一种实现方式是根据这个公式来的 G(n) = B(n) XOR B(n+1), 这也是格雷码和二进制码的转换公式。
一般的,普通二进制码与格雷码可以按以下方法互相转换:
二进制码->格雷码(编码):从最右边一位起,依次将每一位与左边一位异或(XOR),作为对应格雷码该位的值,最左边一位不变(相当于左边是0);
格雷码-〉二进制码(解码):从左边第二位起,将每位与左边一位解码后的值异或,作为该位解码后的值(最左边一位依然不变)。
数学(计算机)描述:
原码:p[n:0];格雷码:c[n:0](n∈N);编码:c=G(p);解码:p=F(c);
书写时按从左向右标号依次减小,即MSB->LSB,编解码也按此顺序进行
编码:
...................c[n]=p[n],
...................c[i]=p[i] XOR p[i+1](i∈N,n-1≥i≥0);
解码:
...................p[n]=c[n],
...................P[i]=c[i] XOR p[i+1](i∈N,n-1≥i≥0)。
Gray Code的编码方式不是唯一的,这里讨论的是最常用的一种。
'''
#G(n) = B(n) XOR B(n+1) ,真考验位操作
def ProductGrayCodeByFormula(widthOfGrayCode):
for i in range(0, 2**widthOfGrayCode):
temp=i
for j in range(0, widthOfGrayCode-1):
#如果异或结果为真
if (temp & (1<<j)) ^ ( (temp>>1) & (1<<j) ) :
temp=temp | (1<<j)
else:
temp=temp & ( ~(1<<j) )
print bin(temp)
def ProductGrayCodeByFormulaDesignByOther(widthOfGrayCode):
for i in range(0, 2**widthOfGrayCode):
temp= i ^ (i>>1)
print bin(temp)
ProductGrayCodeByFormula(4)
ProductGrayCodeByFormulaDesignByOther(4)
格雷码
最新推荐文章于 2018-11-20 20:30:28 发布