笔试真题-递归方式计算某一正整数n的格雷码(Gray Code )

来源:互联网 发布:域名注册网络公司 编辑:程序博客网 时间:2024/06/15 03:59

1、格雷编码简介

在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码(Gray Code)。例如7的格雷码为0101,8的格雷码为0100,9的格雷码为1100。相邻两个数字的编码只需变动一位。其余普通的二进制编码相比,虽然自然二进制码可以直接由数/模转换器转换成模拟信号,但在某些情况,例如从十进制的3转换为4时二进制码的每一位都要变,能使数字电路产生很大的尖峰电流脉冲。而格雷码则没有这一缺点,它在相邻位间转换时,只有一位产生变化。它大大地减少了由一个状态到下一个状态时逻辑的混淆。


2、二进制转换为格雷编码方法

从最右边一位起,依次将每一位与左边一位异或(XOR),作为应格雷码该位的值,最左边一位不变(相当于左边是0)。

例如:7(十进制)-->0110(二进制)-->0101(格雷编码)。

第一步:先将7转换为二进制码0110;

第二步:二进制码最后一位0与倒数第二位1进行异或运算即0 xor 1=1,即为格雷码的最后一位;

第三步:以此类推,格雷码的第倒数第n位等于二进制码的倒数第n位与倒数第n+1位进行异或运算,这里n小于二进制码的长度;

第四步:将二进制码的第一位0,作为格雷码的第一位,故得出0110的格雷码为0101。

3、十进制转二进制的递归实现

转换方法这里不再赘述。即先用n对2取商得到b,再 用n对2取余运算,得到余数a。余数a即二进制的倒数第一位字符。再递归使用商b对2取商和取余,直到商为0为止。具体代码如下。

//递归转将十进制换为二进制编码int praseToBinaryCode(int n,vector<int>* list){int b = n / 2;int a =  n % 2;if(0 == b){list->push_back(a);int m = list->size()%4;//不足4位前面用0补齐if(m!=0){for(int i = 0;i<4-m;i++){list->push_back(0);}}return 0;}else{list->push_back(a);praseToBinaryCode(b,list);}return 0;}

4、二进制编码转格雷编码的递归实现

利用2中阐述的方法很容易实现二进制转格雷编码:

//递归转换为格雷编码int praseToGrayCode(int bCode[], int grayCode[], int i ,int len){if(i>=len-2){grayCode[i] =  bCode[i] ^ bCode[i+1];grayCode[i+1] = bCode[i+1];return 0;}else{grayCode[i] = bCode[i] ^ bCode[i+1];praseToGrayCode(bCode,grayCode,i+1,len);}return 0;}

5、所有代码及程序运行效果

全部代码如下,直接给出来了:
// GrayCode.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <iostream>#include <vector>using namespace std;//递归转换为格雷编码int praseToGrayCode(int bCode[], int grayCode[], int i ,int len){if(i>=len-2){grayCode[i] =  bCode[i] ^ bCode[i+1];grayCode[i+1] = bCode[i+1];return 0;}else{grayCode[i] = bCode[i] ^ bCode[i+1];praseToGrayCode(bCode,grayCode,i+1,len);}return 0;}//递归转将十进制换为二进制编码int praseToBinaryCode(int n,vector<int>* list){int b = n / 2;int a =  n % 2;if(0 == b){list->push_back(a);int m = list->size()%4;//不足4位前面用0补齐if(m!=0){for(int i = 0;i<4-m;i++){list->push_back(0);}}return 0;}else{list->push_back(a);praseToBinaryCode(b,list);}return 0;}void print(int* p,int len){for(int i = len-1;i>=0;i--){int c = p[i];printf("%d",c);}printf("\n");}int _tmain(int argc, _TCHAR* argv[]){while(1){int n;cout<<"请输入任意正整数:";cin>>n;vector<int> bCodeList;praseToBinaryCode(n,&bCodeList);int size= bCodeList.size();int* bCode = new int[size];for(int i =0;i<size;i++){int c = bCodeList.at(i);bCode[i]=c;} cout<<"binay Code is:";print(bCode,size);int* grayCode = new int[size];praseToGrayCode(bCode,grayCode,0,size);cout<<"Gray Code is:";print(grayCode,size);delete[] bCode;delete[] grayCode;}return 0;}

运行效果如下:


算法有不懂得地方可以参考下面的这篇文章:
http://blog.sina.com.cn/s/blog_6d30f67301017tv7.html
里面还包括格雷编码的解码方法。

0 0
原创粉丝点击