也谈自动生成格雷码算法

  工作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;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值