基本概念

格雷码是一种准权码,具有一种反射特性和循环特性的单步自补码,它的循环、单步特性消除了随机取数时出现重大误差的可能,它的反射、自补特性使得求反非常方便。格雷码属于可靠性编码,是一种错误最小化的编码方式。

自然二进制码可以直接由数/模转换器转换成模拟信号,但是在某些情况下,例如从十进制的3转换到4的二进制时,每一位都要变。3的二进制位:,而4的二进制位:100,所以这就会使数字电路产生很大的尖峰电流脉冲。而格雷码则没有这一缺点,它是一种数字排序系统,其中的所有相邻整数在它们的数字表示中只有一个数字不同。它在任意两个相邻的数之间转换时,只有一个数位发生变化。它大大地减少了由一个状态到下一个状态时逻辑的混淆。另外由于最大数与最小数之间也仅一个位不同,故通常又叫格雷反射码或循环码。

二进制和格雷码的转换

二进制码编码成格雷码的准则:从二进制码的最右一位起,依次将每一位与左边一位异或(XOR)运算,其结果作为对应位格雷码的值,最左位不变。

设有 N 位二进制数 B(i),其中 0 <= i <= N - 1;它可以变换成为同样位数的格雷码 G(i)。
二进制数与格雷码的转换公式如下:

  G(i) = B(i+) XOR B(i);  <= i < N -
  G(i) = B(i); i = N -

格雷码解码成二进制码的准则:从左边第二位起,将每位与左边一位解码后的值异或,作为该位解码后的值(最左边一位依然不变)。

设有 N 位格雷码 G(i),把它转换成自然二进制数的算法如下。

自然二进制码的最高位等于雷码的最高位;
自然二进制码的次高位为最高位自然二进制码与次高位格雷码相异或;
自然二进制码的其余各位与次高位自然二进制码的求法相类似。
转换公式如下:

  B(i) = G(i);      i = N -
  B(i) = B(i+) XOR G(i); <= i < N -

下表给出了二进制码与格雷码的对应关系,十进制数用4为二进制码表示。

十进制数 二进制数 格雷码

位运算符

&       与运算 
      |       或运算 
      ^       异或运算 
      ~       非运算(求补) 
    > >       右移运算 
    < <       左移运算

下面代码会用到异或运算符。

C++实现二进制码编码成格雷码

#include "stdafx.h"
#include <iostream>
#include <cmath>
using namespace std; #define MAX 1000 int BCD[MAX];
int GRAYCODE[MAX];
int temp[MAX];
//BCD码转换成格雷码
void bcdToGraycode(int bcd[], int gray[], int rightIndex)
{
if (rightIndex == )
{
gray[rightIndex] = bcd[rightIndex];
return;
}
else
{
gray[rightIndex] = bcd[rightIndex] ^ bcd[rightIndex - ];
bcdToGraycode(bcd, gray, rightIndex - );
}
} int main()
{
int number;
//二进制数组长度
int index = ;
int len;
int m = ;
int t;
//输入一个十进制数
cin >> number;
//转换成二进制数
while (number)
{
temp[index++] = number % ;
number = number >> ;
}
//按照标准格式输出,位数为2的整数次幂
while ()
{
t = pow(, m);
if (index <= t)
{
len = t - ;
break;
}
else
{
m++;
}
} for (int i = ; i <= len; i++)
{
BCD[i] = ;
}
t = index - ;
for (int i = ; i < index; i++)
BCD[len - index + + i] = temp[t--];
bcdToGraycode(BCD, GRAYCODE, len);
for (int i = ; i <= len; i++)
cout << GRAYCODE[i] << ' ';
return ;
}

Gray Code - 格雷码的更多相关文章

  1. [LeetCode] Gray Code 格雷码

    The gray code is a binary numeral system where two successive values differ in only one bit. Given a ...

  2. gray code 格雷码 递归

    格雷码 the n-1 bit code, with 0 prepended to each word, followd by the n-1 bit code in reverse order, w ...

  3. [LeetCode] 89. Gray Code 格雷码

    The gray code is a binary numeral system where two successive values differ in only one bit. Given a ...

  4. [LintCode] Gray Code 格雷码

    The gray code is a binary numeral system where two successive values differ in only one bit. Given a ...

  5. HDU 5375 Gray code 格雷码(水题)

    题意:给一个二进制数(包含3种符号:'0'  '1'  '?'  ,问号可随意 ),要求将其转成格雷码,给一个序列a,若转成的格雷码第i位为1,则得分+a[i].求填充问号使得得分最多. 思路:如果了 ...

  6. 089 Gray Code 格雷编码

    格雷编码是一个二进制数字系统,在该系统中,两个连续的数值仅有一个位数的差异.给定一个代表编码总位数的非负整数 n,打印格雷码序列.格雷码序列必须以0开头.例如, 给定 n = 2, 返回 [0,1,3 ...

  7. Leetcode89. Gray Code格雷编码

    给定一个代表编码总位数的非负整数 n,打印其格雷编码序列.格雷编码序列必须以 0 开头. 示例 1: 输入: 2 输出: [0,1,3,2] 解释: 00 - 0 01 - 1 11 - 3 10 - ...

  8. LeetCode:Gray Code(格雷码)

    题目链接 The gray code is a binary numeral system where two successive values differ in only one bit. Gi ...

  9. 格雷码(Gray code)仿真

    作者:桂. 时间:2018-05-12  16:25:02 链接:http://www.cnblogs.com/xingshansi/p/9029081.html 前言 FIFO中的计数用的是格雷码, ...

随机推荐

  1. Windows 上安装docker

    Windows 上安装docker //(第一种)下载boot2docker https://github.com/boot2docker/windows-installer/releases //( ...

  2. Android Hawk数据库 github开源项目

    Android Hawk数据库 github开源项目 Hawk 是一个很便捷的数据库  . 操作数据库仅仅需一行代码 , 能存不论什么数据类型 . github 地址: https://github. ...

  3. 解决fonts.googleapis.com不能访问,导致网页打不开

    最近,访问linode.com网站,突然发现网速好慢,老是打不开网页.分析一下网页才知道,原来使用了fonts.googleapis.com 打不开的原因就很明显了,咋办呢?百度啊,百度,最后,终于找 ...

  4. 从零開始学android&lt;mediaplayer自带播放器(视频播放).四十九.&gt;

    MediaPlayer除了能够对音频播放之外,也能够对视频进行播放,可是假设要播放视频仅仅依靠MediaPlayer还是不够的.还须要编写一个能够用于视频显示的空间,而这块显示空间要求能够高速的进行G ...

  5. SQL查询刚開始学习的人指南读书笔记(二)创建SQL查询

    PARTII: SQL Basics CHAPTER 4Creating a Simple Query 介绍一种怎样创建SQL语句的技术--"Request/Translation/Clea ...

  6. 每日英语:He Diets, She Diets: More Weight-Loss Plans Target Men

    Weight-loss companies are becoming savvier about getting men to go on a diet. savvier:更加精明 Men and w ...

  7. 给singer的左侧添加fixedTitle,并显示向上滚动偏移效果;

    1.将写好的dom绝对定位到顶部: 2.dom值为singerlist的currentIndex.title(通过计算属性获取),如果有则显示fixedTitle,没有则隐藏: 3.计算diff:当d ...

  8. string.h中的库函数

    虽然面试的时候,都会叫你不使用c库函数,自己完成某某函数的编写,但是库函数毕竟更让人信赖,我们没有任何理由怀疑库函数而使用自己的版本.不过当做练习,自己还是可以实现一下的.这里记录一下5th c pr ...

  9. vs2010程序运行出错 link : fatal error lnk1123: 转换到 coff 期间失败: 文件无效或损坏

    vs2010程序运行出错 link : fatal error lnk1123: 转换到 coff 期间失败: 文件无效或损坏 2014-03-27 11:34杜_柏 | 浏览 36144 次 请问这 ...

  10. 分享JQuery动画插件Velocity.js的六种列表加载特效

    分享JQuery动画插件Velocity.js的六种列表加载特效.在这款实例中给中六种不同的列表加载效果.分别为从上飞入.从右侧飞入.从左侧飞入.和渐显.一起看下效果图: 在线预览   源码下载 实现 ...