【C++编程题】格雷码与自然二进制码转换

        格雷码是数字信号处理中常用编码方式。格雷码中任意两个相邻代码的二进制位中只有一位不同,对于最大编码和最小编码也成立。

1.异或法转换

1.1 二进制码转格雷码

二进制码转格雷码 [1]

1)将二进制最高位{​{B}_{n-1}}保留;

2)对于二进制码中剩余的任意第 i 位,将其与第 i + 1 位异或得到当前的位; 

1.2 格雷码转二进制码

         

格雷码转二进制 [1]

1)将格雷码最高位{​{G}_{n-1}}保留;

2)将已经得到的第 i 位二进制码与第 i  - 1位格雷码异或,得到第 i - 1 位二进制码;

2. C++ 代码参考

vector<int> grayCode(int n) {
    int count = 1 << n;
    vector<int> res(count,0);
    for(int i = 1 ; i < count; i ++)
    {
        int bin = i,cur = bin >> (n - 1);
        for(int k = n - 1; k > 0; k --)
            cur = (cur << 1) + (((bin >> k) & 1) ^ ((bin >>(k - 1)) & 1));
        res[i] = cur;
    }
    return res;
}

 上述函数输入为格雷码的位数,输出为一个序列,包含所有 n 位格雷码的十进制数;

2.1 代码说明

1.int count = 1 << n;

此处将 1 左移 n 位,得到 n 位格雷码的个数,由于是从 0 开始计算,所以格雷码数量为${​{2}^{n}}-1$

 4.int bin = i,cur = bin >> (n - 1);

取出当前需要转换的二进制数 ,将其向右移动(n-1)位得到第 n 位。

6.cur = (cur << 1) + (((bin >> k) & 1) ^ ((bin >>(k - 1)) & 1));

从高位到低位依次与前一位进行异或操作。与 1 进行与操作的目的是将当前位置以外的数据位置零;

参考:格雷码与二进制的转换_格雷码转换为二进制码的方法-CSDN博客 

           Gray Code(格雷码) C++多方法实现_格雷码c++-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值