#Z1ZMOJ0018. 格雷码
格雷码
当前没有测试数据。
格雷码
格雷码(Gray code)由贝尔实验室的弗兰克.格雷(Frank Grnay)在 20 世纪 40 年代提出。
将2^n^个长为n的二进制串组成一个序列,使得将序列按圆形排列时一对相邻的二进制串只有一位不同,
则称这些序列为n阶格雷码,简称格雷码。
在格雷码中,任意两个相邻的代码只有一位二进制数不同,最大码与取小码之间也仅一位不同,即“首尾相连”,
因此又称循环码或反射码。
例如,长度为3的格雷码为:
对n位二进制的码字从右到左以0到n-1编号,一个n位普通二进制码记为
一个 n 位格雷码记为
普通的 n 位二进制码转换为 n 位格雷码的规则为:
普通的 n 位二进制码转换为 n 位格雷码的规则为:$\left\{
\begin{array}{l}
G_{n-1} = B_{n-1} \\
G_i = B_i \oplus B_{i+1}
\end{array}
\right.$
其中, 表示异或运算符。

n位格雷码转换为普通n 位二进制码的规则为:
n位格雷码转换为普通n 位二进制码的规则为:$\left\{ \begin{array}{l} B_{n-1} = G_{n-1} \\ B_i = G_i \oplus B_{i+1} \end{array} \right.$

// 将二进制数转换成格雷码
void Bin_to_Gray(){
reverse(B,B+len);
// 将字符转换成数字
for(int i=0;i<=len-1;i++){
B[i] = B[i] - '0';
}
// 最高位的格雷码就是其二进制码
G[len-1] = B[len-1];
// 求剩余位
for(int i=len-2;i>=0;i--){
// 当前格雷码 = 前一位二进制码 异或 当前二进制位
G[i] = B[i] ^ B[i+1];
}
for(int i=len-1;i>=0;i--){
cout << G[i];
}
}
// 将格雷码转换成二进制数
void Gray_to_Bin(){
reverse(Gray,Gray+n);
// 转换数字
for(int i=0;i<n;i++) Gray[i] -= '0';
// 求最高位二进制
Bin[n-1] = Gray[n-1];
// 求剩余位二进制
for(int i=n-2;i>=0;i--){
// 当前位的二进制码 = 当前位的格雷码 异或 前一位的二进制码
Bin[i] = Gray[i] ^ Bin[i+1];
}
for(int i=n-1;i>=0;i--){
cout << Bin[i];
}
}
相关
在以下作业中: