您的位置:首页 > 其它

格雷码(gray code)

2014-09-17 21:30 369 查看
格雷码是二进制数字系统,两个顺序格雷码之间只有一位(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)位格雷码中的前2n个码字等于n位格雷码的码字,按顺序书写,加前缀0

(n+1)位格雷码中的后2n个码字等于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)位格雷码中的前2n个码字等于n位格雷码的码字,按顺序书写,加前缀0

(n+1)位格雷码中的后2n个码字等于n位格雷码的码字,按逆序书写,加前缀1
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: