数字电子技术(02):数学系统,数学计算,数学编码¶
二进制,十进制,十六进制,八进制之间的相互转换¶
任何其他进制转十进制:权和法¶
如何将任何进制转化为十进制,步骤如下:
- 确定待转进制的基数
- 将数字转化成权和形式,并计算
- 算出的结果即十进制对应的数
2"转"10
转化二进制数\((1011)_{2}\)
- 基数是\(2\)
- 权和:\(1\times 2^{3}+0\times 2^{2}+1\times 2^{1}+1\times 2^{0}\)
- 结果\((11)_{10}\)
十进制转二进制: 长除法,长乘法¶
对于十进制转二进制,我们常用的办法是长除法(整数),长乘法(小数)
- 对整数部分不断对二取模,逆序输出
- 对小数部分不断乘二,取出整数部分,再循环,顺序输出.
10"转"2
转换给定数字\((25.25)_{10}\)为二进制
- 对整数部分不断对二取模,逆序输出,因此为\((11001)_{2}\)
- 小数部分可以直接写成\((0.01)_{2}\)(假如你熟悉的话),或者写出0.5,1两个位就可以.
- 得出结果:\((11001.01)_{2}\)
二进制转八进制,十六进制:三分法和四分法¶
每三位二进制可以表示一个八进制数,每四位二进制可以表示一个十六进制数字,直接换就可以了.
二转八
将\((111000010100)_{2}\)转化为八进制 三位三位分就完了:\((111/000/010/100)_{2}\) 因此结果就是\((7024)_{8}\)
二转十六
将\((111000010100)_{2}\)转化为十六进制 四位四位分就完了:\((1110/0001/0100/)_{2}\) 因此结果就是\((\text{E14})_{16}\)
将四分法强制作用于十进制:BCD码¶
既然我们可以用上面的方法来对应八进制和十六进制,为何不能作用到十进制上呢,当然有数学家已经这么做了,这就是BCD码. BCD码和十进制的每一个数位对应,在进位的时候要跳过六个非法位(A,B,C,D,E,F),说到进位,我们接下来就要来讲这些数制的运算规律
不同数制的运算¶
由于我们先前学过可以很快地将八进制和十六进制与二进制互相转化,而我们又深谙十进制计算,我们主要关注二进制计算的方法.
二进制运算¶
无符号二进制数运算¶
加法¶
无符号计算的语境下,不存在符号位,只要掌握下面四个等式就可以做任何加法计算了
- \(0+0=0\)
- \(0+1=1\)
- \(1+0=1\)
- \(1+1=10\)(0,进位\(1\))
小学加法
计算\((110)_{2}+(010)_{2}\). 我们按上面的方式: 得数的末位为\(0\),第二位也为\(0\),第三位\(1+1=0\),带一个进位,第四位为\(1\) 因此结果是:\((1000)_{2}\) 这是正确的,因为从十进制看,\(6+2=8\)
减法¶
同样的,也是四个等式:
- \(0-0=0\)
- \(1-0=1\)
- \(1-1=0\)
- \(0-1=1\)(向前借位)
小学减法
计算\((110)_{2}-(010)_{2}\). 我们按上面的方式: 得数的末位为\(0\),第二位也为\(0\),第三位\(1-0=1\) 因此结果是:\((100)_{2}\) 这是正确的,因为从十进制看,\(6-2=4\)
符号的噩梦¶
不是小学减法
计算\((010)_{2}-(110)_{2}\).
这个实例告诉我们,无符号整数是有限制的,我们需要一个符号.
原码,反码,补码¶
- 一个数自己的二进制叫原码
- 对原码按位取反得到反码
- 反码+1叫补码
只用原码就是无符号算数.我们一开始考虑将第一位用作符号位,然后将原码开头是\(0\)作为正数,这个数的反码是它的相反数,这听起来很棒.
!!! warning 两个"0" \(0\)既可以是全零,也可以是全1,这给我们带来了很大的麻烦
所以我们用补码来表示相反数.
补码速算法
从右往左数到第一个\(1\),保留这个\(1\)和右边的所有位为原码,左边的位统统变为反码,得到的就是补码
减法就是加法¶
在补码的体系下,减去一个数,就是加上它的补码(相反数).我们在这里不纠结这个计算方法的数学本质.我们再来看一下上面的题
不是小学减法
计算\((0010)_{2}-(0110)_{2}\).(注意,补了符号位) 先求\((0110)_{2}\)的补码,即\((1010)_{2}\) 然后做加法,得到\((1100)_{2}\). 这是什么数字呢,求其原码,得\((0100)_{2}\),确实\(2-6=-4\).
界限:上溢出和下溢出¶
!!! error "上溢出"的实例 计算有符号整数\((0110)_{2}+(0111)_{2}\). 按常理计算,得到\((1101)_{2}\),问题是:\(6+7=-5\)?
由于符号位的存在,当我们的和/差的分别超过\(2^{n-1}-1\)和\(-2^{n-1}\)时,这个时候就会发生溢出.溢出的一种解决方法是补上一些前导\(0\).
!!! note "解决溢出"的实例 计算有符号整数\((0110)_{2}+(0111)_{2}\). 因为会溢出,因此应当写成\((00110)_{2}+(00111)_{2}\) 这时候我们就能算出\((01101)_{2}\)
其他进制运算¶
八,十六进制计算¶
既然他们都能用二进制来计算为什么不转成二进制呢?这便是方案
BCD 码运算¶
就是十进制运算,只不过就是四位数表示一位而已,记进位必须跳过六个非法的数位(ABCDEF)