在国外社交网站做产品推广,设计类专业笔记本电脑推荐排行,希爱力的功效及副作用,京东云安装wordpress说明 Gray Code是一个数列集合#xff0c;每个数使用二进位来表示#xff0c;假设使用n位元来表示每个数好了#xff0c;任两个数之间只有一个位元值不同#xff0c;例如以下为3位元的Gray Code#xff1a;
000 001 011 010 110 111 101 100 由定义可以知道#xff0c;G…说明 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是由贝尔实验室的Frank Gray在1940年代提出的用来在使用PCMPusle Code Modulation方法传送讯号时避免出错并于1953年三月十七日取得美国专利。
解法 由于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(void) { 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[i1]); } for(i bits - 1; i 0; i--) printf(%c, digit[i]); printf(\n); NEXT(odd); } return 0;
}