文章目录

  • 格雷码
  • 普通二进制码转换成格雷码
  • 格雷码转换成普通二进制码
  • 进一步
  • Reference

文章中内容与图片大部分来自Reference,本文只是以方便自己理解的方式进行整理。

格雷码

在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同且最高位与最低位也只有一位二进制数不同, 则称这种编码为格雷码(Gray Code)

普通二进制码转换成格雷码

二进制码转换成二进制格雷码,其法则是保留二进制码的最高位作为格雷码的最高位,而次高位格雷码为二进制码的高位与次高位相异或,而格雷码其余各位与次高位的求法相类似。


经过简单验证,1010->1111,没毛病
但是如果格雷码只是从0变到10呢?
从10回到0,便是四个二进制位都需要变化

格雷码转换成普通二进制码

二进制格雷码转换成二进制码,其法则是保留格雷码的最高位作为自然二进制码的最高位,而次高位自然二进制码为高位自然二进制码与次高位格雷码相异或。


以1010为例,1010->1100,没毛病

进一步

如果编码从末尾变到开头,如从10变到0
对应的是1111到0000
便是四个二进制位都需要变化
现有的方法似乎有问题了
更一般的来讲,格雷码的特性似乎只能满足2^n种状态,如果实际需要不是呢?

通过观察上面的表格可以发现,格雷码具有对称性。0-15这16个格雷码,如果前后去掉相同个数的格雷码,那么剩余的格雷码仍然符合相邻两个数只有1 bit的跳变,也包括最后一个到第一个的跳变。

如果只需要10个状态,可以同时去掉开头三个和结尾三个。

  • 我们在由addr得到格雷码时不能直接转换,而是要使用addr + 3进行转换;同理由格雷码转换回addr时,也不要忘记减去3。
  • 使用这种编码时,FIFO的满判断逻辑就不是简单的高两位相反,低位相同了。

Reference

格雷码Gray Code详解
FIFO设计中与深度depth相关的问题 作者的文章质量很高,指的学习
异步FIFO设计 一个完整的异步FIFO设计(虽然本文没有引用)

格雷码与普通二进制码的相互转换——学习笔记相关推荐

  1. 二进制格雷码与自然二进制码之间的转换

    什么是格雷码? 格雷码,又叫循环二进制码或反射二进制码,格雷码是我们在工程中常会遇到的一种编码方式,它的基本的特点就是任意两个相邻的代码只有一位二进制数不同. 二进制格雷码与自然二进制码的互换 1.二 ...

  2. 嵌入式之uboot源码分析-启动第一阶段学习笔记

    注: 以下的内容来自朱老师物联网大讲堂uboot部分课件 Uboot启动第一阶段start.S执行步骤 1.头文件包含 <config.h>(x210的各种宏定义) <version ...

  3. 【51码儿】【Linux学习笔记】第1章 安装、登录CentOS7

    本笔记由51码儿(www.51mar.com)提供 1.1学习之初 预习和复习的重要性(预习:大致看看命令等,有印象.复习:随时浏览) 当日事当日毕(只能做到当周事当周毕,保证给自己的理由,不能越堆越 ...

  4. 两位阿里大牛联合敬献,码出高效的Java学习笔记,你值得拥有

    写在前面 成长并没有直线式的捷径,"不走弯路就是捷径" 这个观点未必正确.弯路是成长的必经之路,我们在成长的路上需要注意的是保证弯路的前进大方向与直线的行进方向基本一致. 南辕北辙 ...

  5. android源码编译 简书,android学习笔记之源码编译

    编译环境 1.需要Ubuntu 64bit,建议Ubuntu14.04 64-bit 2.安装openJDK7 $ sudo apt-get update $ sudo apt-get install ...

  6. java byte 赋值 原码,Java基础第二天学习笔记

    02.01_Java语言基础(常量的概述和使用)(掌握) * A:什么是常量 * 在程序执行的过程中其值不可以发生改变 * B:Java中常量的分类 * 字面值常量 * 自定义常量(面向对象部分讲) ...

  7. as工程放到源码编译_方舟编译器学习笔记2 源码编译

    根据方舟官方文档编译了方舟编译器的源码,在这里简单谈谈其源码的编译过程: 1.操作系统环境: 64位版本的Ubuntu(官方推荐Ubuntu 16.04).我自己本身就有Ubuntu 16.04的虚拟 ...

  8. JAVA正反合——原码、补码与反码学习笔记’

    1.正反合--"原补反" Byte b=-11; 1 0 0 0 1 0 1 1 图1-1 图1-1为-11的原码形式; 1 0 0 0 1 0 1 1 图1-2 图1-2为-11 ...

  9. AFL源码分析之afl-clang-fast(学习笔记)

    前言 通过afl-gcc来插桩这种做法已经属于不建议,更好的就是afl-clang-fast工具是通过llvm pass来插桩. #ifdef 是判断某个宏是否被定义,若已定义,执行随后的语句 #en ...

最新文章

  1. JAVA中float和double的区别、String和char的区别
  2. docker日志存放路径
  3. php autoload静态,Composer 中自动加载 autoload_static 问题
  4. adb 连接某个wifi_一加7 Pro全局强制开启90Hz刷新率的办法(附ADB文件下载)
  5. Mysql之group by 和order by 一起用时的排序问题(亲测)
  6. eureka对比Zookeeper:
  7. java泛型中的E,K,V,T,U,S
  8. gpedit msc组策略面板 win10在哪里_Win10家庭版找不到本地组策略gpedit.msc解决办法...
  9. 问题集锦13:数据库升级后,程序无法连接数据库
  10. 《Getting Started with WebRTC》第二章 WebRTC技术介绍
  11. spark练习之统计广告Top3
  12. element 如何自定义svg图标_【第2018期】小图标,大学问
  13. python3读取网页内容_python3获取一个网页特定内容
  14. 服务器复制文件出现io错误,win10系统复制文件提示“由于io设备错误”的图文方案...
  15. 基于DFS的拓扑排序算法实现
  16. lnmp、lamp、lnmpa一键安装包(Updated: 2021-01-06)
  17. Solana代码解析
  18. 猫和老鼠服务器正在修复中,猫和老鼠手游:关于29日在游戏中出现的异常问题 是暗改还是bug?...
  19. 计算机网络 划分子网构造超网
  20. android不能访问数据库文件,android下访问已存在的sqlite数据库文件的办法

热门文章

  1. 基于simulink的MPPT仿真输出最大功率
  2. Matlab聚类分析_层次聚类+kmeans聚类等
  3. 瘦客户机如何安装ubuntu-20.04-live-server-amd64
  4. 机器学习不会解决自然语言理解(NLU)问题
  5. 360bpsvc一直占用电脑大量cpu,任务管理器也无法结束进程这个进程、360bpsvc也无法卸载的解决办法:
  6. centos7解压.tar.bz2,.tar.gz,.tar.xz文件
  7. 专利说明书的发明/实用新型内容与具体实施方式的差异
  8. 使用postman生成测试报告
  9. Java 数组排序工具类
  10. 安卓手机如果清楚微信内置浏览器cookie