二进制编码之格雷码

LeeCode89格雷码
没有提前了解过格雷码的可能没有思路,一般会先找规律,但是会耗费很长时间也没有思路。
学习过格雷码的同学可能会记得一个公式,而这个题目也就是按照这个公式求解的。(数电课程,是不是想到卡诺图了?卡诺图也是按照格雷码画的,这里就不再细说。)

二进制编码

有权码有权码有权码无权码无权码
十进制8421码5421码2421码余3码BCD格雷码
000000000000000110000
100010001000101000001
200100010001001010011
300110011001101100010
401000100010001110110
501011000101110000111
601100110110010010101
701110111110110100100
810001011111010111100
910011100111111001101
  • 有权码是每一位有自身的权重。
  • 无权码则是每一位没有权重。
  • 余3码则是8421码+3得来的。
  • 格雷码是一种循环码,其特点是任何相邻的两个码字,仅有一位代码不同,其他位相同。

重点
如何保证格雷码的特点?

十进制8421码异或右移一位格雷码
0000^000000
1001^000001
2010^001011
3011^001010
4100^010110
5101^010111
6110^011101
7111^011100

可以发现,格雷码是通过8421码本身和其右移一位异或得来的

公式想表达的意思也就是如此:
G(i) = B(i) ^ B(i+1)
其中G是格雷码,B是8421码。

贴一张百度百科的图,图的意思:

  • 高位补0
  • 高位与后一位异或得高位
    贴一张百度百科的图片

经过上面的介绍本题也就没有难度了
代码:

class Solution {
public:
    vector<int> grayCode(int n) {
        vector<int> Gray(1 << n);//1左移n位;2的n次方
        for (int i = 0; i != Gray.size(); ++i) {
            Gray[i] = i ^ (i >> 1);//G(i) = B(i) ^ B(i+1)
        }
        return Gray;
    }
};
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值