格雷码是任意两个相邻数的代码只有一位二进制数不同的编码。
例如以下为三位元的格雷码:000 001 011 010 110 111 101 100。
正反向公式:
\(G(n) = n \oplus (n >> 1)\)
\(n = G(n) \oplus (G(n) >> 1) \oplus ... \oplus 1\)
由异或运算的自反性可以从正向证明到反向。
int g(int n) {
return n ^ (n >> 1);
}
int rev_g(int g) {
int n = 0;
for(; g; g >>= 1) n ^= g;
return n;
}
原文:https://www.cnblogs.com/sakyo/p/13742165.html