也谈自动生成格雷码算法
2017-11-08 11:27
204 查看
工作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;
}
百度了一下,发现网上的例子都晦涩难懂。看了看百度百科的例子,也依然一头雾水。正郁闷着呢,发现其上有一张说明格雷码跟二进制码的关系图。一下茅塞顿开。图片如下:
其实只要看懂了这张图,格雷码的编解码都是小菜一碟。格雷码的每一个位其实都是对应二进制码的位跟其较高位的异或。简单说就是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;
}
相关文章推荐
- 自动生成格雷码算法
- C#生成安装文件后自动附加数据库的思路跟算法
- C#生成安装文件后自动附加数据库的思路跟算法
- 也谈Eclipse未自动在gen目录下生成R.java
- 两种n位格雷码生成算法
- 格雷码生成算法详解(c语言)
- 微博用户标签自动生成算法
- 基于粒子群算法的软件测试用例自动生成算法
- 微博用户标签自动生成算法
- Gray码的生成算法(直接由二进制数转格雷码)
- 基于格雷码生成算法的n选m排列算法
- C#生成安装文件后自动附加数据库的思路跟算法
- PHP树的深度编历生成迷宫及A*自动寻路算法实例分析
- 微博用户标签自动生成算法
- 格雷码生成算法
- c#自动附加分离备份还原数据库 C#生成安装文件后自动附加数据库的思路跟算法 打包之后,运行之前
- 适用于分布式的自动生成算法
- C#生成安装文件后自动附加数据库的思路跟算法
- 算法与数据结构——算法题 45:生成格雷码(腾讯笔试题) ? 待解决
- 任意多边形三维屋顶自动生成算法