Gray Code - 格雷码
基本概念
格雷码是一种准权码,具有一种反射特性和循环特性的单步自补码,它的循环、单步特性消除了随机取数时出现重大误差的可能,它的反射、自补特性使得求反非常方便。格雷码属于可靠性编码,是一种错误最小化的编码方式。
自然二进制码可以直接由数/模转换器转换成模拟信号,但是在某些情况下,例如从十进制的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 - 格雷码的更多相关文章
- [LeetCode] Gray Code 格雷码
The gray code is a binary numeral system where two successive values differ in only one bit. Given a ...
- gray code 格雷码 递归
格雷码 the n-1 bit code, with 0 prepended to each word, followd by the n-1 bit code in reverse order, w ...
- [LeetCode] 89. Gray Code 格雷码
The gray code is a binary numeral system where two successive values differ in only one bit. Given a ...
- [LintCode] Gray Code 格雷码
The gray code is a binary numeral system where two successive values differ in only one bit. Given a ...
- HDU 5375 Gray code 格雷码(水题)
题意:给一个二进制数(包含3种符号:'0' '1' '?' ,问号可随意 ),要求将其转成格雷码,给一个序列a,若转成的格雷码第i位为1,则得分+a[i].求填充问号使得得分最多. 思路:如果了 ...
- 089 Gray Code 格雷编码
格雷编码是一个二进制数字系统,在该系统中,两个连续的数值仅有一个位数的差异.给定一个代表编码总位数的非负整数 n,打印格雷码序列.格雷码序列必须以0开头.例如, 给定 n = 2, 返回 [0,1,3 ...
- Leetcode89. Gray Code格雷编码
给定一个代表编码总位数的非负整数 n,打印其格雷编码序列.格雷编码序列必须以 0 开头. 示例 1: 输入: 2 输出: [0,1,3,2] 解释: 00 - 0 01 - 1 11 - 3 10 - ...
- LeetCode:Gray Code(格雷码)
题目链接 The gray code is a binary numeral system where two successive values differ in only one bit. Gi ...
- 格雷码(Gray code)仿真
作者:桂. 时间:2018-05-12 16:25:02 链接:http://www.cnblogs.com/xingshansi/p/9029081.html 前言 FIFO中的计数用的是格雷码, ...
随机推荐
- spineRunTime for cocos2dx v3 中动画播完删除animation
spineRunTime for cocos2dx v3 中删除animation,发现下面写法会崩溃: spine::SkeletonAnimation* animationNode = spi ...
- javascript限定输入textarea输入长度
<textarea id="content" onkeyup="limitLength(this.value,'512','content')"> ...
- STORM在线业务实践-集群空闲CPU飙高问题排查(转)
最近将公司的在线业务迁移到Storm集群上,上线后遇到低峰期CPU耗费严重的情况.在解决问题的过程中深入了解了storm的内部实现原理,并且解决了一个storm0.9-0.10版本一直存在的严重bug ...
- IE兼容模式下 SCRIPT1028: 缺少标识符、字符串或数字
例如下面一段代码 var a = { x: 1, y: 2, }; alert(a.x); 如果在IE的兼容性视图(IE7文档模式)下,会报告下面的错误: SCRIPT1028: 缺少标识符.字符串或 ...
- [sh]shell小结
一 判断 -d 测试是否为目录.-f 判断是否为文件. -s 判断文件是否为空 如果不为空 则返回0,否则返回1 -e 测试文件或目录是否存在. -r 测试当前用户是否有权限读取. -w 测试当前用户 ...
- GCC实现多文件编译,静态库,动态库
一 代码 //add.h int add(int a, int b); //add.c int add(int a, int b) { return a+b; } //main.c #incl ...
- TransitiveClosure
http://acm.nudt.edu.cn/~twcourse/TransitiveClosure.html https://en.wikipedia.org/wiki/Closure_(mathe ...
- 启用div作为编辑器 添加contentEditalbe = “true”,如何让在Html中特殊字符不被转义
今天项目中碰到了两个难以解决的问题,一个是ctrl + enter键换行,enter键发送和支持html特殊字符的发送,二人会话和群会话都必须支持,发送短信的模块也必须支持特殊的字符,但是现在碰到的问 ...
- C++构造函数的调用
C++中类的构造函数的调用有四种形式 C++中对象的实例化有四种情况: 1.调用默认构造函数. 2.隐式调用构造函数 3.显示调用构造函数 4.使用new操作符 如图所示,前三种在对象的作用域之外就会 ...
- Python 部署 flask 用uwsgi和nginx
安装uwsgi nginx 具体方法请百度 1.在项目目录下建立.ini文件 xad_uwsgi.ini [uwsgi] master=true #项目目录 chdir=/root/zhaoyingj ...