第n个格雷码
计算第n个格雷码的公式为:
(n-1) XOR (floor((n-1)/2))
(Source: wikipedia)
我把它编码为:
int gray(int n)
{
n--;
return n ^ (n >> 1);
}
有人可以解释上述公式是如何工作的,或者可能是它的推导?
没有找到相关结果
已邀请:
4 个回复
艾食魄轻县
原始Xor结果和移位结果在单个位中有所不同(我用上面的点标记它们)。这意味着如果你对它们进行xor,你将获得1位设置的模式。所以,
由于xor给出了不同位的1,它证明了,相邻代码的区别仅在于单个位,而这是我们想要得到的格雷码的主要特性。 因此,为了完整性,可以证明,N可以从其N ^(N >> 1)值恢复:知道第n位代码,我们可以使用xor恢复第n-1位。
从最大位开始(它用0进行xored),因此我们可以恢复整数。
渴翅吮斡撤
到
的值是
到
值的两倍加上零或一。 编辑:这太令人困惑了。我的意思是,
和
按某种顺序分别为
和
。
场竟矩喘崩
是
或
。例如,
是
或
。现在,我们知道如果
大于
,
将是反射(按位反转)。 换一种说法:
完整地计算出数学,对于从零开始的格雷码,你得到
。
吞睫素
后:
更容易计算,但似乎只将尾随
改为
(即将整个拖尾块归零1除了最高1)和
归
(即在尾随0中翻转最高0)足以获得格雷码。