格雷码是数字信号处理中常用编码方式。格雷码中任意两个相邻代码的二进制位中只有一位不同,对于最大编码和最小编码也成立。
1.异或法转换
1.1 二进制码转格雷码
1)将二进制最高位保留;
2)对于二进制码中剩余的任意第 i 位,将其与第 i + 1 位异或得到当前的位;
1.2 格雷码转二进制码
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 开始计算,所以格雷码数量为。
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博客
标签:bin,格雷,二进制码,cur,int,编程,C++,异或 From: https://blog.csdn.net/m0_65484315/article/details/141954673