搬砖小技巧|什么是格雷编码?

给你一个整数 n ,返回任一有效的 n 位格雷码序列 。

题目如上。那么什么是格雷编码?以下摘自百度百科

在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码(Gray Code),另外由于最大数与最小数之间也仅一位数不同,即“首尾相连”,因此又称循环码或反射码。 

在数字系统中,常要求代码按一定顺序变化。例如,按自然数递增计数,若采用8421码,则数0111变到1000时四位均要变化,而在实际电路中,4位的变化不可能绝对同时发生,则计数中可能出现短暂的其它代码(1100、1111等)。在特定情况下可能导致电路状态错误或输入错误。使用格雷码可以避免这种错误。格雷码有多种编码形式。 

给出例子:

1位格雷编码:00 01 对应[0,1]

2位格雷编码:00 01 11 10 对应[0,1,3,2]

3位格雷编码:000 001 011 010 110 111 101 100 对应[0,1,3,2,6,7,5,4]

……

不难发现,n位格雷编码的前一半编码与(n-1)位编码是一样的。如何用计算机复现这一串编码呢?我有想过用递归,但是过于繁琐,觉得还是应该找规律来解决。以下给出简洁的格雷编码重现:

vector<int> grayCode(int n) {
    vector<int> res;
    for(int i = 0;i < 1<<n; i++)
    {
        res.push_back(i ^ i>>1);
    }   
    return res;
}

 n位的格雷编码有\large 2^n个,我们用位移符号来计算:1<<n。

除此之外,最重要的,格雷编码如何实现呢?我们以3位格雷编码为例:

0 = 000 = 000 ^ 000 = 0 ^ 0

1 = 001 = 001 ^ 000 = 1 ^ 0 

3 = 011 = 010 ^ 001 = 2 ^ 1

2 = 010 = 011 ^ 001 = 3 ^ 1

6 = 110 = 100 ^ 010 = 4 ^ 2

7 = 111 = 101 ^ 010 = 5 ^ 2

5 = 101 = 110 ^ 011 = 6 ^ 3

4 = 100 = 111 ^ 011 = 7 ^ 3

参照如上规律,就可以写出第i位的编码了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鲸鲸爱柠檬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值