格雷码是一种数字编码方式,使得相邻数字之间只有一个数字的差异为 1。“格雷码”一词通常用于指“反射”码,更具体地说是指二进制反射格雷码。
要将二进制数 转换为其对应的二进制反射格雷码,从右侧的数字 (第 个或最后一个数字)开始。如果 为 1,则将 替换为 ;否则,保持不变。然后继续到 。继续直到第一个数字 ,由于 被假定为 0,所以保持不变。结果数字 是反射二进制格雷码。
要将二进制反射格雷码 转换为二进制数,再次从第 位数字开始,并计算
如果 为 1,则将 替换为 ;否则,保持不变。接下来计算
等等。结果数字 是对应于初始二进制反射格雷码的二进制数。
该代码被称为反射码,因为它可以通过以下方式生成。取格雷码 0, 1。先正向写,再反向写:0, 1, 1, 0。然后在前半部分前面加上 0,后半部分前面加上 1:00, 01, 11, 10。继续,写 00, 01, 11, 10, 10, 11, 01, 00 得到:000, 001, 011, 010, 110, 111, 101, 100, ... (OEIS A014550)。因此,每次迭代都会使代码数量翻倍。
上面的图表显示了前 255 个(上图)和前 511 个(下图)格雷码的二进制表示。下表给出了对应于前几个非负整数的格雷码。
0 | 0 | 20 | 11110 | 40 | 111100 |
1 | 1 | 21 | 11111 | 41 | 111101 |
2 | 11 | 22 | 11101 | 42 | 111111 |
3 | 10 | 23 | 11100 | 43 | 111110 |
4 | 110 | 24 | 10100 | 44 | 111010 |
5 | 111 | 25 | 10101 | 45 | 111011 |
6 | 101 | 26 | 10111 | 46 | 111001 |
7 | 100 | 27 | 10110 | 47 | 111000 |
8 | 1100 | 28 | 10010 | 48 | 101000 |
9 | 1101 | 29 | 10011 | 49 | 101001 |
10 | 1111 | 30 | 10001 | 50 | 101011 |
11 | 1110 | 31 | 10000 | 51 | 101010 |
12 | 1010 | 32 | 110000 | 52 | 101110 |
13 | 1011 | 33 | 110001 | 53 | 101111 |
14 | 1001 | 34 | 110011 | 54 | 101101 |
15 | 1000 | 35 | 110010 | 55 | 101100 |
16 | 11000 | 36 | 110110 | 56 | 100100 |
17 | 11001 | 37 | 110111 | 57 | 100101 |
18 | 11011 | 38 | 110101 | 58 | 100111 |
19 | 11010 | 39 | 110100 | 59 | 100110 |
二进制反射格雷码与河内塔和中国环的解,以及超立方体图的哈密顿环(包括方向反转;Skiena 1990,第 149 页)密切相关。