也谈自动生成格雷码算法

来源:互联网 发布:软件登记在哪里办理 编辑:程序博客网 时间:2024/06/05 05:59

  工作10年了,总觉得自己是不是应该学点什么。今天突发奇想,是不是可以用程序来自动生成格雷码?

  百度了一下,发现网上的例子都晦涩难懂。看了看百度百科的例子,也依然一头雾水。正郁闷着呢,发现其上有一张说明格雷码跟二进制码的关系图。一下茅塞顿开。图片如下:



   其实只要看懂了这张图,格雷码的编解码都是小菜一碟。格雷码的每一个位其实都是对应二进制码的位跟其较高位的异或。简单说就是g0 = b1 ^ b0;

   拿起gcc就开始写,编码函数就这么完成了。

int grayencode(int x)
{
return x^(x>>1);
}

  然后就是解码了,解码相对复杂点。当然有了编码程序,你也可以用穷举的办法。但这里其实可以不用穷举。将上图中的过程反过来,对于N位的格雷码解码程序如下。

int graydecode(int x)
{
int i, y=0;
for (i = N-1; i >= 0; i--)
y |= (x&(1<<i)) ^ ((y>>1)&(1<<i));
return y;
}

在wiki上发现一个解码程序写的非常好。就是不清楚具体是怎么来的。
unsigned int graydecode(unsigned int num)
{
unsigned int mask = num;
while (mask != 0)
{
  mask >>= 1;
  num ^= mask;
}
return num;
}

原创粉丝点击