格雷码

# -*- 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)

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值