格雷码的相邻元素之间只有一个二进制位有区别。构造过程如下:

先加入 ,然后重复以下两个步骤:

  1. 将当前数的最低位(即第 位翻转),作为下一个数加入;
  2. 将当前数的 左边的位翻转,作为下一个数加入。

意思是,假如生成的数列是 ,那么当 为奇数时由 经过第一种步骤生成;当 为偶数时由 经过第二种步骤生成。

参考实现:

vector<int> gray = { 0 };
for (int i = 1; i < n; ++i) {
    if (i % 2) {
        gray.emplace_back(1 ^ gray.back());
    } else {
        gray.emplace_back((1 << 1 + lsp(gray.back())) ^ gray.back());
    }
}