返回首页 C++ 模板

格雷编码模板

相邻两个编码只有一位不同——镜子反射构造法

格雷码 Gray码 反射 GESP6
#include <bits/stdc++.h>
using namespace std;

// 镜像反射法生成格雷码
vector<int> grayCode(int n) {
    vector<int> res;
    res.push_back(0);
    for (int i = 0; i < n; i++) {
        int size = res.size();
        for (int j = size - 1; j >= 0; j--)
            res.push_back(res[j] | (1 << i));
    }
    return res;
}

// 二进制转格雷码:gray = n ^ (n >> 1)
int bin2gray(int n) { return n ^ (n >> 1); }

// 格雷码转二进制
int gray2bin(int gray) {
    int bin = gray;
    while (gray >>= 1) bin ^= gray;
    return bin;
}

int main() {
    int n = 3;
    auto codes = grayCode(n);
    for (int c : codes) {
        cout << bitset<3>(c) << " ";
    }
    // 000 001 011 010 110 111 101 100
    return 0;
}

📖 要点说明

⚠️ 常见错误