数字系统
数字逻辑是计算机科学的基础,它研究的是如何通过逻辑门电路(与门、或门、非门等)实现各种逻辑功能。数字系统则是由数字逻辑电路组成的系统,可以实现各种复杂的运算和控制功能。在计算机科学中,数字逻辑和数字系统是非常重要的基础知识,它们是构成计算机硬件和软件的基础。
数字系统定义了用独特的符号(数码)来表示一个数字。在不同的数字系统中,一个数字有不同的表示方法,使用有限的数字符号来表示数字。比如:阿拉伯数字数字系统:0、1、2、3、4、5、6、7、8、9;罗马数字系统:I II III IV V VI VII... 。数字系统可分为:位置化系统和非位置化系统。
位置化和非位置化数字系统
在位置化数字系统中,数字符号所占据的位置决定了其表示的值。常用的有:十进制、二进制、十六进制和八进制。在该系统中,数字这样表示:
它的值是:
其中:S是一套符号集,b是底(或基数),b=s符号集中的符号总数,+/-表示数字为正或负。例如:以十进制数字系统为例,则S表示的集合为 S={0,1,2,3,4,5,6,7,8,9},b=10;假设随便取一个十进制数66,则它的数字表示为 +(66)10 (其中10为下标),只是一般省略+、()和底,直接表示为66,;如果是-66,则“-”符号不能省略。
注意:这些符号不能直接存储在计算机中,计算机存储正负数的方式不同。
十进制系统(以10为底)
在十进制系统中,整数(没有小数部分的整型数字)使我们所熟悉的,我们在日常生活中使用整数。例如:520,它是一个三位数,实际上,它的计算方式为:5×10^2+2×10^1+0乘以10^0,即((10×100)+(2×10)+(0×1))=500+20+0=520。
有时我们需要知道用数码k表示的十进制整数的最大值,该最大值=10^k-1。例如:k=4时,可以表示的数字最大值为10的4次方-1,即10000-1=9999。
此外,更为广泛的是实数(带有小数部分的数字),其指计算方式为:
例如:-66.66的值计算为 -(6×10^1+6×10^0+6×10^-1+6×10^-2),即-(6×10+6×1+6×0.6+6×0.06)=-66.66。
二进制系统(以2为底)
符号集为 S={0,1},底 b=2;该系统中的符号常被称为二进制数码或位(位数码),数据和程序是以二进制模式(即位模式),存储在计算机中的,这是因为计算机由电子开关制成,它们仅有开和关两种状态,1和0分别表示两种不同的状态。
同理,二进制系统数值计算方法如下:
例如:(1101.01)2(其中2为底数表示二进制),这样一个二进制数字要转换为十进制可以用:1×2^3+1×2^2+0×2^1+1×2^0+0×2^(-1)+1×2^(-2)=8+4+0+1+0+0.25=13.25
有时我们需要知道用数码k表示的十进制整数的最大值,该最大值=2^k-1。 例如:当k=4时,最大值为(1111)2(其中2为底数表示二进制),其值为15=2^4-1。
十六进制系统(以16为底)
尽管二进制系统用于存储计算机数据,但是不便于在计算机外部表示数字,因为与十进制相比,二进制符号过长。而十进制不能直接存储在计算机中,在二进制和十进制数字之间没有显然的关系,而且他们之间的转换也不快捷。为了克服这个问题,发明了两种位置化系统:十六进制和八进制。
十六进制符号集 S={0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F},其中A,B,C,D,E,F分别表示10、11、12、13、14、15;底为 b=16。可能你会奇怪为什么不用10、11等数字来表示,而用字母来表示?因为在我们的数字系统中符号都是单个的,而且如果用10、11等数字来表示就容易出现歧义,如:1123,这里的11是表示两个1还是11?因此为了避免这种情况,用字母来表示比较合适。
同理,十六进制系统数值计算方法如下:
用数码k表示的十六进制整数的最大值,该最大值=2^k-1。 例如:当k=4时,最大值为(FFFF)16(其中16为底数表示十六进制),其值为16^4-1=65535。
八进制系统(以8为底)
符号集为 S={0,1,2,3,4,5,6,7},底 b=8;
同理,八进制系统数值计算方法如下:
用数码k表示的八进制整数的最大值,该最大值=8^k-1。 例如:当k=5时,最大值为(77777)8(其中8为底数表示八进制),其值为8^5-1=32767。
二进制、八进制、十六进制转为十进制
将二进制、八进制、十六进制转为十进制就是用下面公式:
其中将S替换为相应的符号集,b替换为相应的底数即可。
例如此时有数字(1010)2(其中2为底数),则代入公式为:1×2^3+0×2^2+1×2^1+0×2^0=8+0+2+0=10
十进制转为二进制、八进制或十六进制
转换需要分为两步,第一步为计算整数部分,第二步为计算小数部分。
首先整数部分计算规则为不断除以要转化进制的底数,直到商为0时停止,并且每一步计算之后记录得到的余数,再将得到的余数倒着写即可。例如:十进制数9转换为2进制数的计算过程如下,得到的结果为(1001)2,其中2为底数表示2进制数。
接下来以十进制数172转换为8进制数为例,转换结果为254,计算过程如下图:
接下来是小数部分的转换,用十进制的小数乘以要转化的进制的底数部分并取整数正序排列即可,而对于部分无限循环的则可以通过限制取到几位即停止。例如:十进制数0.625转换为小数部分计算规则如下:
具体过程为:首先将0.625×2得到结果为1.25,再将整数部分1取出,得到剩下的为0.25,再将0.25×2得到0.5,再将整数部分0取出得到0.5,再将0.5×2得到结果为1.0,此时取出整数部分1之后即可停止计算,因为小数部分为0不管怎么计算乘以任何数都是0;在将取出的整数顺序排列即可得到结果,即十进制数0.625转换为二进制数为0.101。
下面再给出一个例子:将十进制数0.634转换为8进制数且结果精确到5为小数,结果为0.50446,具体计算过程如下图:
二进制和八进制相互转换
每三个二进制数都可以转换为八进制数中的一位,如下图
二进制数 | 八进制数 |
---|---|
001 | 1 |
010 | 2 |
011 | 3 |
100 | 4 |
101 | 5 |
110 | 6 |
111 | 7 |
只需要将二进制数每三位排在一起转换为对应的八进制数字即可,例如:二进制数00011001,可以写为 000 011 001,转换为0 3 1,则对应的八进制数为31。
二进制和十六进制相互转化
每四个二进制数都可以转换为十六进制数中的一位,如下图
二进制数 | 十六进制数 |
---|---|
0001 | 1 |
0010 | 2 |
0011 | 3 |
0100 | 4 |
0101 | 5 |
0110 | 6 |
0111 | 7 |
1000 | 8 |
1001 | 9 |
1010 | A |
1011 | B |
1100 | C |
1101 | D |
1110 | E |
1111 | F |
只需要将二进制数每四位排在一起转换为对应的十六进制数字即可,例如:二进制数00011001,可以写为 0001 1001,转换为1 9,则对应的八进制数为19。