格雷码是二进制数字系统,两个顺序格雷码之间只有一位(one bit)不同。例如2位的格雷码序列:[0,1,3,2]。
00 -- 0
01 -- 1
11 -- 3
10 -- 2
现给出格雷码的位数,求出格雷码序列。
可以用如下规则(fromhttp://baike.baidu.com/view/358724.htm?from_id=11296193&type=syn&fromtitle=Gray+code&fr=aladdin)递归构造:
-
1位格雷码有两个码字
-
(n+1)位格雷码中的前2 n个码字等于n位格雷码的码字,按顺序书写,加前缀0
-
(n+1)位格雷码中的后2 n个码字等于n位格雷码的码字,按逆序书写,加前缀1
我写了一个测试代码,如下:
/** * The gray code is a binary numeral system where two successive values differ * in only one bit * * Given a non-negative integer n representing the total number of bits in the code * print the sequence of gray code. * A gray code sequence must begin with 0 * * For example,given n=2,return [0,1,3,2].its gray code sequence is: * * 00-0 * 01-1 * 11-3 * 10-2 * * * Above describe from leetcode Gray Code. * * Edit by jianyong lee * Southwest University * 2014/9/17 * */ #include <iostream> #include <vector> using namespace std; class Solution { public: Solution() {} vector<int> grayCode(int n); }; vector<int> Solution::grayCode(int n) { vector<int> r1{0,1}; if(n==1) { return r1; } vector<int> temp=grayCode(n-1); vector<int> r2(temp); for(vector<int>::iterator it=temp.end()-1;it>=temp.begin();it--) { // 计算二进制位数 傻逼,n就是二进制的位数!!!! // ad右移n-1位 int ad=1; for(int i=0;i<n-1;i++) { ad=ad<<1; } int num=(*it)+ad; r2.push_back(num); } return r2; } template<typename T> std::ostream &operator<<(std::ostream &s,const vector<T> &v) { for(const auto e:v) { s<<e<<" "; } return s; } int main() { cout << "Hello World!" << endl; Solution sulo; vector<int> rs; rs=sulo.grayCode(4); cout<<rs<<endl; return 0; }
-
1位格雷码有两个码字
-
(n+1)位格雷码中的前2 n个码字等于n位格雷码的码字,按顺序书写,加前缀0
-
(n+1)位格雷码中的后2 n个码字等于n位格雷码的码字,按逆序书写,加前缀1