格雷码(Gray code)是一种任意两相邻项有且仅有一位不同的二进制编码。
直观来看,其构造方式如下:假如我们构造出了格雷码$g_{0, 1, \cdots, 2^m-1}$,现在考虑构造$m+1$位格雷码。我们将前$2^m$位复制一遍,然后反转在原序列中的位置,也即$g’_{2^m+i}=g_{2^m-1-i}, i \in [0, 2^m)$;然后在最后$2^m$项格雷码的左侧分别添上$1$。由此有$g_{2^m+i}=g_{2^m-1-i}+2^m$。
实际操作时,可以采用相邻两项的异或值与前缀异或和快速构造。假若有$g_x$与$g_{x-1}$的异或值序列$s_{1, 2, \cdots, 2^m-1}$,那么便有$s_{2^m+i}=s_{i}, i \in [1, 2^m)$,同时有$s_{2^m+1}=g_{2^m+1} \oplus g_{2^m}=2^m$。
例如,前8项格雷码的二进制表示为:$\{\text{0b}000, \text{0b}00{\color{blue}1}, \text{0b}0{\color{blue}1}1, \text{0b}01{\color{blue}0}, \text{0b}{\color{blue}1}10, \text{0b}11{\color{blue}1}, \text{0b}1{\color{blue}0}1, \text{0b}10{\color{blue}0}\}$,相邻两项异或值为$\{1,2,1,4,1,2,1\}$。
(更多…)