格雷码(gray code)

(格雷码,Gray Code)格雷码是对十进制数的一种二进制编码。编码顺序与相应的十进制数的大小不一致。其特点是:对于两个相邻的十进制数,对应的两个格雷码只有一个二进制位不同。另外,最大数与最小数之间也仅有一个二进制位不同,以 4 位二进制数为例,格雷编码如下:

十进制数格雷码十进制数格雷码
0000081100
1000191101
20011101111
30010111110
40110121010
50111131011
60101141001
70100151000

如果把每个二进制的位看作一个开关,则将一个数变为相邻的另一个数,只须改动一个开关。因此,格雷码广泛用于信号处理、数-模转换等领域。

下面程序的任务是:由键盘输入二进制数的位数n(n<16),再输入一个十进制数 m(0≤m<2n),然后输出对应于 m 的格雷码(共 n 位,用数组 gr[] 存放)。

为了将程序补充完整,你必须认真分析上表的规律,特别是对格雷码固定的某一位,从哪个十进制数起,由0 变为 1,或由 1 变为 0。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/**************************************************************** 
 * Description: C++ implementation of gray code
 * Author: Alex Li
 * Date: 2023-04-25 21:12:31
 * LastEditTime: 2023-06-10 17:09:49
****************************************************************/

#include <stdio.h>
int main(){
	
	int bound = 1, m, n, b, p, gr[15];
	//由键盘输入二进制数的位数n(n<16),再输入一个十进制数 m(0≤m<2n),
	printf( "input n,m\n" );
	scanf( "%d%d", &n, &m );
	for (int i = 1; i <= n; i++ )
		bound = bound*2;
	if ( m < 0 || m >= bound ){
		printf( "Data error!\n" );
		return 0;
	}
	b = 1;
	for ( int i = 1; i <= n; i++ ){
		p = 0; 
        b = b * 2;
		for ( int j=0; j <= m; j++ )
			if ( (j%b-(b/2))==0 )
				p = 1 - p;
		gr[i] = p;
	}
	for ( int i = n; i>=1;i--)
		printf( "%1d", gr[i] );  
	printf( "\n" );
}
Scroll to Top