数字电路一:绪论—信息—编码

 写在前面的话:

 

大二上学期初修该课程,本以为相对于通信而言该课程不重要,学的并不扎实,好多重要的知识点没有搞明白,但是随着学习的进展,发现该课程是一切硬件电路的基础,如芒在背,所以于大二下学期暑假中重新学习,有幸在b站上找到王红主讲的清华大学《数字电子技术》 50讲视频教程,特此整理听课笔记及回忆一些重点提醒后来者。

视频课程链接(视频质量挺高的记得给作者投个币):https://www.bilibili.com/video/BV16x411i7FW 

绪论

 进入正题:

首先

电子电路的作用→处理信息

             ↓ 

       能量转换

 

 

 其中信号可以由数字信号与模拟信号构成,分别对应数电与模电。(郑益慧老师的模电有机会也整个专题,讲的也真的好)

从而数电是用离散电压来表示信息,以实现信息传递与控制。

 

编码

 

一:编码的规范

遵循:唯一性,效率性(如数据结构中的哈夫曼编码),可靠性,安全性。

 

 二:编码的数制与码制

数制:表示数量的规则(十进制,二进制,八进制,十六进制等等)

如:(重点问题:进制之间的转化规则)

 

部分捷径:

十进制下2000的二进制表示为:011111010000

011/111/010/000每三位读取换算为八进制:3720

0111/1101/0000每四位读取换算为十六进制:7d0(也写作0x7d0)

可以直接利用位数读取,以此类推每5位读取对应32进制,每6位读取对应64进制等等(只适合二的倍数进制间的转化)

 

而十进制的99对应1/100/011对应八进制的143可以一眼看出,十六进制也可一眼看出,但从二进制返回十进制只能一位一位加公式为:D=ΣKi•Ni   

 

再着重强调一类特殊情况:

不同进制间小数的转化:

 

十进制小数转换成N进制小数采用“乘N取整”法。具体做法为:

用N乘以十进制小数,可以得到一个积,这个积分整数部分和小数部分;

将积的整数部分取出写好,再用N乘以余下的小数部分,又得到一个新的积;

再将积的整数部分取出,继续用N乘以余下的小数部分;

……

如此反复进行,每次都取出整数部分写到小数点后,再用N接着乘以小数部分,直到积中的小数部分为0,或者达到所需要的精度为止。

 

 

 图源网络,侵删。

 

我们已经了解到进制的事项

那么如何直接进行二进制间的计算呢?

 

首先介绍三种编码方式:原码,反码,补码。

 

一:原码

                 ■               ■■■......■■■

                 ↓                       ↓ 

            符号位             数值部分

比如:[14]10=[1110]2=0  1110

         [-14]10=[-1110]2=1  1110

(其中正数符号位为0,负数符号位则为1) 

 

原码的两大缺点:

第一:0的表示有两种表示方法,正零与负零表示方式不同,这会导致有一个码位被浪费,且不符合常理。

第二:不方便计算,如-5+5的结果为0 101+1 101=0 010 与实际情况不符,所以确实不方便直接计算。

 

为了解决这两个缺点,我们先铺垫一种码制——反码。

 

二:反码

                 ■               ■■■......■■■

                 ↓                       ↓ 

            符号位             数值部分:其中正数不变,负数每一位一次取反。

比如:[14]10=[1110]2=0  1110

         [-14]10=[-1110]2=1  0001

 

这便是反码,同样存在两个设计缺陷:正零与负零表示方式不同及无法直接计算的问题。

 

 

我们为了解决这两大缺陷重新设计了码制————补码(核心的核心)

三:补码

                 ■               ■■■......■■■

                 ↓                       ↓ 

            符号位             数值部分:其中正数采用原码设计方式,负数取反后加一。

比如:[7]10=[0111]2=0  0111(正数与原码一致)

         [-7]10=[-0111]2=1  1001(为7的原码取反加一)

 

从而我们发现,7与-7相加,进位产生了溢出,使得7-7=0,解决了缺陷二

对于缺陷一:不论是正零还是负零,补码表示均为0   00....00 同样解决了缺陷一

一种近乎完美的编码法则,至此出现。

 

这是通过人类设计得到的,巧妙地解决了两大缺陷,从而广泛应用。

 

 

 

由于0的码为补码表示为0   00....00,相对于负数而言,正数编码位减少了一个。

这也就是c++中,int整型中的-2147483648~2147483647负数比正数范围多了一个的原因,可见补码用处范围之广,同样也是挺有意思的。

 

 

码制:表示事物的规则

 用不同数码表示不同事物时遵循的规则。(比如学号,车牌号等等)

 对于不同的实际问题选取不同的编码规则来表示事物。

 

常见的编码规则有一种叫BCD码的

BCD码也称二进码十进数,BCD码可分为有权码和无权码两类。其中,常见的有权BCD码有8421码、2421码、5421码,无权BCD码有余3码、余3循环码、格雷码。

 

 

 

 

这些编码规则各有用途,每一种均有长处,当然我们知道,每获取一些新的性能时,需要牺牲原有的部分优良性能,从而对于不同问题选择不同编码方式才是硬道理。

 

 

 

 

新的问题

 

问题一:

我们已经知道了补码的样子,那么补码的小数怎么表示呢。

同样是采取,取反加一的口诀。

如-2.625的补码为:

首先将-2.625换算成小数样子,1  010.101,除了符号位取反得1  101.010

在该列数的末尾加一即可得到补码1  101.011

可见 ' 1 ' 不是数值上的1 ,而是为了使得与对应正数相加为零时,补的1。

 

 

P.S 补码还有另外一种理解方式

 

符号位为负数,依次从该负数中减去每一位的数值含义,也可以得到换算关系。

 

 

如果想再深入思考补码蕴含的数学原理,则可参考张子秋的    https://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html

其中对数学规则同余的讲解。

 

原创不易,转载请注明出处 https://www.cnblogs.com/Shade-of-Greenland/p/13398854.html。

 

posted @ 2020-07-30 23:57  浅草寺的光影  阅读(531)  评论(0)    收藏  举报