在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码(Gray Code),另外由于最大数与最小数之间也仅一位数不同,即“首尾相连”,因此又称循环码或反射码。在数字系统中,常要求代码按一定顺序变化。例如,按自然数递增计数,若采用8421码,则数0111变到1000时四位均要变化,而在实际电路中,4位的变化不可能绝对同时发生,则计数中可能出现短暂的其它代码(1100、1111等)。在特定情况下可能导致电路状态错误或输入错误。使用格雷码可以避免这种错误。格雷码有多种编码形式。
转换方法
递归生成码表
这种方法基于格雷码是反射码的事实,利用递归的如下规则来构造:
- 1位格雷码有两个码字
- (n+1)位格雷码中的前2n个码字等于n位格雷码的码字,按顺序书写,加前缀0
- (n+1)位格雷码中的后2n个码字等于n位格雷码的码字,按逆序书写,加前缀1
异或转换
二进制码→格雷码(编码):
二进制码→格雷码(解码):
程序实现
1.异或转换
1 #include <iostream> 2 #include <vector> 3 #include <string> 4 #include <cmath> 5 #include <math.h> 6 using namespace std; 7 // 十进制转二进制/ 8 // intput:十进制数字,和所需的位数 9 // output:二进制字符串 10 string num2Binary(int num,int bitNum); 11 12 // 实现n位格雷码 13 // intput:格雷码的位数 14 // output:graycode 15 void getGrayCode(int bitNum); 16 void getGrayCode2(int bitNum,vector<string> &grayCode);//实现实参的改变要用引用 17 18 int main() 19 { 20 int m=35; 21 string c=num2Binary(m,8); 22 cout<<c<<endl; 23 vector<string> rel; 24 /*getGrayCode(4);*/ 25 getGrayCode2(4,rel); 26 for (vector<string>::size_type i=0;i!=rel.size();i++) 27 { 28 cout<<rel[i]<<endl; 29 } 30 return 0; 31 } 32 33 void getGrayCode(int bitNum) 34 { 35 string grayCode; 36 for (int i=0;i<pow(2,bitNum);i++) 37 { 38 int temp=(i>>1)^i; 39 grayCode=(num2Binary(temp,bitNum)); 40 cout<<grayCode<<endl; 41 } 42 } 43 44 void getGrayCode2(int bitNum,vector<string> &grayCode) 45 { 46 for (int i=0;i<pow(2,bitNum);i++) 47 { 48 int temp=(i>>1)^i; 49 string str=num2Binary(temp,bitNum); 50 grayCode.push_back(str); 51 /*cout<<grayCode[i]<<endl;*/ 52 } 53 } 54 string num2Binary(int num,int bitNum) 55 { 56 string str; 57 string result=""; 58 for (int i=bitNum-1;i>=0;i--) 59 { 60 int x=(num>>i)&1; 61 stringstream ss; 62 ss<<x; 63 ss>>str; 64 result+=str; 65 /*str.clear();*/ 66 } 67 return result; 68 }
2.递归码表实现
1 vector<string> getGrayCode3(int bitNum) 2 { 3 vector<string> grayCode(pow(2,bitNum)); 4 if (bitNum==1) 5 { 6 grayCode[0]="0"; 7 grayCode[1]="1"; 8 return grayCode; 9 } 10 else 11 { 12 vector<string> lastGrayCode=getGrayCode3(bitNum-1); 13 for (vector<string>::size_type i=0;i!=lastGrayCode.size();i++) 14 { 15 grayCode[i]="0"+lastGrayCode[i]; 16 grayCode[grayCode.size()-1-i]="1"+lastGrayCode[i]; 17 } 18 for (vector<string>::size_type j=0;j!=grayCode.size();j++) 19 { 20 cout<<grayCode[j]<<endl; 21 } 22 return grayCode; 23 } 24 25 }
时间: 2024-10-03 14:35:47