C实现 输出格雷码(Gray Code)

本文介绍了 Gray Code,一种在PCM传输中减少错误的二进制数列,其特点是相邻两个数之间仅有一位不同。文章详细阐述了 Gray Code 的生成规则,并通过一个4位 Gray Code 示例解释了位变化规律。此外,还探讨了 Gray Code 在二维和三维空间的几何意义,如四边形和立方体的顶点路径。最后,给出了 C 语言的代码实现,用于生成指定位数的 Gray Code 序列。
摘要由CSDN通过智能技术生成

问题引入

        Gray Code是由贝尔实验室的Frank Gray在1940年代提出的,用来在使用PCM(Pusle Code Modulation)方法传送讯号时避免出错,并于1953年三月十七日取得美国专利。

        Gray Code是一个数列集合,每个数使用二进位来表示,假设使用n位元来表示每个数好了,任 两个数之间只有一个位元值不同,例如以下为3位元的Gray  Code:

                                        000 001 011 010 110 111 101 100

        Gray Code的顺序并不是唯一的,例如将上面的数列反过来写,也是一组Gray Code:

                                        100 101 111 110 010 011 001 000

问题分析

        由于Gray Code相邻两数之间只改变一个位元,所以可观察Gray Code从1变0或从0变1时的位置,假设有4位元的Gray Code如下:

                0000 0001 0011 0010 0110 0111 0101 0100

                1100 1101 1111 1110 1010 1011 1001 1000

        对于奇数项,无论它是第几个Gray Code,永远只改变最右边的位元,如果 是1就改为0,如果是0就改为1。对偶数项,所改变的位元,是由右边算来第一个1的左边位元。所以只要判断位元的位置是奇数还是偶数,就可以决定要改变哪一个位元的值,为了方便,将数组索引0当作最右边的值,输出结果时,由索引数字大的开始反向输出。

        将2位元的Gray Code当作平面座标来看,可以构成一个四边形,您可以发现从任一顶点出发, 绕四边形周长绕一圈,所经过的顶点座标就是一组 Gray Code,所以您可以得到四组Gray Code。同样的将3位元的Gray Code当作平面座标来看的话,可以构成一个正立方体,如果您可以从任 一顶点出发,将所有的边长走过,并不重复经过顶点的话,所经过的顶点座标顺序之组合也就 是一组Gray Code。

代码实现

#include <stdio.h>
#include <stdlib.h>
#define MAXBIT 20
#define TRUE 1
#define CHANGE_BIT(x) x = ((x) == '0' ? '1' : '0')
#define NEXT(x) x = (1 - (x))

int main() {
	char digit[MAXBIT]; 
	int i, bits, odd;
	printf("输入位元数:"); 
	scanf("%d", &bits);
	for(i = 0; i < bits; i++){ 
		digit[i] = '0';
		printf("0");
	}
	printf("\n"); 
	odd = TRUE; 
	while(1){
		if(odd)
			CHANGE_BIT(digit[0]);
		else{
			// 计算第一个1的位置
			for(i = 0; i < bits && digit[i] == '0'; i++) ; 
			if(i == bits - 1) //  最后一个Gray Code
				break; 
			CHANGE_BIT(digit[i+1]);
		}
		for(i = bits - 1; i >= 0; i--)
			printf("%c", digit[i]);
		printf("\n"); 
		NEXT(odd);
	}
	return 0;
}

运行结果

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

等日出看彩虹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值