#Z1ZMOJ0018. 格雷码

格雷码

当前没有测试数据。

格雷码

格雷码(Gray code)由贝尔实验室的弗兰克.格雷(Frank Grnay)在 20 世纪 40 年代提出。

将2^n^个长为n的二进制串组成一个序列,使得将序列按圆形排列时一对相邻的二进制串只有一位不同,

则称这些序列为n阶格雷码,简称格雷码

在格雷码中,任意两个相邻的代码只有一位二进制数不同,最大码与取小码之间也仅一位不同,即“首尾相连”,

因此又称循环码或反射码。

例如,长度为3的格雷码为:000,001,011,010,110,111,101100000, 001, 011, 010, 110, 111, 101,100

对n位二进制的码字从右到左以0n-1编号,一个n位普通二进制码记为 Bn1...B1B0B_{n-1}...B_1B_0

一个 n 位格雷码记为Gn1...G1G0G_{n-1}...G_1G_0

普通的 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.$

其中, \oplus 表示异或运算符。 ​

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];
    }
}

格雷码转二进制

二进制转格雷码