算法学习 - Gray Code(格雷码)的解释和c++实现
2014-12-11 02:23
274 查看
Gray Code(格雷码)
典型的二进制格雷码(Binary Gray Code)简称格雷码。当初是为了通信,现在则常用于模拟-数字转换和位置-数字转换中。特点是:一组数的编码中,若任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码。
格雷码属于可靠性编码,是一种错误最小化的编码方式。
格雷码是一种绝对编码方式。
由于格雷码是一种变权码。
格雷码的十进制数奇偶性与其码字中1的个数的奇偶性相同。
十进制转换为格雷码
好的上面我们已经介绍那么多了,那么我来说下如何把一个十进制的数字转换成格雷码呢?首先把十进制的数字转换成二进制的形式。
对n位二进制的码字,从右到左,以0到n-1编号。
如果二进制码字的第i位和i+1位相同,则对应的格雷码的第i位为0,否则为1(当i+1=n时,二进制码字的第n位被认为是0,即第n-1位不变)。
举例来说:
首先12 -> 二进制:1100
然后二进制码是:
1100编号为
0-3
然后在
1100前补一个
0,则变为
01100,这样开始操作。
0异或
1为1.
1异或
1为0.
1异或
0为1.
0异或
0为0.
所以格雷码为
1010。
格雷码转换为十进制
现在我们假设获取到一个格雷码为1010.如何解码为十进制呢。从左边第二位起,将每位与左边一位解码后的值异或,作为该位解码后的值(最左边一位依然不变)。依次异或,直到最低位。依次异或转换后的值(二进制数)就是格雷码转换后二进制码的值。
所以操作结果是:
0与第一位
1进行异或结果为
1
上面结果
1与第二位
0异或结果为
1
上面结果
1与第三位
1异或结果为
0
上面结果
0与第四位
0异或结果为
0
所以二进制的值为:
1100->十进制为:
12.
代码实现
下面放上代码实现,这个代码里只放了编码部分,没放解码。假如对解码有问题,可以评论告诉我。// // main.cpp // GrayCode_leetcode // // Created by Alps on 14/12/7. // Copyright (c) 2014年 chen. All rights reserved. // #include <iostream> #include <vector> #include <math.h> #include <string.h> using namespace std; class Solution{ public: vector<int> grayCode(int n){ vector<int> gray; if (n < 1) { gray.push_back(0); return gray; } int num = pow(2,n); int graycode ; for (int i = 0; i < num; i++) { IntToBit(graycode, i, n); BitToGray(graycode,n); gray.push_back(GrayBitToInt(graycode, n)); } return gray; } void IntToBit(int *code, int n, int bit){ int i = bit-1; while (i >= 0) { code[i--] = n%2; n/=2; } } void BitToGray(int *code, int bit){ int temp[bit]; temp[0] = 0^code[0]; for (int i = 0; i < bit-1; i++) { temp[i+1] = code[i]^code[i+1]; } for (int i = 0; i < bit; i++) { code[i] = temp[i]; } } int GrayBitToInt(int *code, int bit){ int number = 0; for (int i = 0; i < bit; i++) { if (code[i] == 1) { number += pow(2, bit-i-1); } } return number; } }; int main(int argc, const char * argv[]) { vector<int> test; Solution sl; test = sl.grayCode(3); vector<int>::iterator iter; for (iter = test.begin(); iter != test.end(); iter++) { printf("%d\n",*iter); } return 0; }
相关文章推荐
- 算法学习-桶排序(Bucket Sort) C++实现
- 算法学习 - 堆排序 ( HeapSort ) C++实现
- 机器学习决策树学习算法(C++实现)
- 【学习】关于电梯算法的C++实现
- 算法学习 - 最长公共子序列(LCS)C++实现
- 算法学习——搜索和C++ STL 实现全排列和去重全排列
- c++实现gray code(格雷码)
- 算法学习 - 括号匹配(栈实现)C++
- 算法学习 - 选择排序的稳定性讨论(C++实现)
- 算法学习 - 快速幂和矩阵快速幂(复杂度Olog(n))C++实现
- 经典算法学习————快速排序算法的c++实现
- 一个无聊男人的疯狂《数据结构与算法分析-C++描述》学习笔记 习题2.8 随机数组的三种生成算法(补) 将bash的实现翻译成比较纯正的bash风格
- 算法学习 - 后缀表达式 (C++ 栈实现)
- 算法学习 - Bellman-Ford(贝尔曼福特)算法(C++实现)
- c++实现gray code(格雷码)
- 算法学习记录五(C++)--->两个栈实现队列
- 学习算法 - 表指针实现~ C++
- 算法学习 - Bloom Filter(布隆过滤器)学习实现(C++实现)
- 算法学习-哈夫曼编码(c++实现)
- 算法学习 - 链表的游标实现~ C++