数字电路一:绪论—信息—编码
写在前面的话:
大二上学期初修该课程,本以为相对于通信而言该课程不重要,学的并不扎实,好多重要的知识点没有搞明白,但是随着学习的进展,发现该课程是一切硬件电路的基础,如芒在背,所以于大二下学期暑假中重新学习,有幸在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。