多年不用, 都忘记了, 可能当初也是学的有点稀里糊涂, 这几天看了些书和文章, 逐渐理清些思路, 现在总结备忘如下:
一.为什么会有10进制, 2进制,8进制,16进制?
10对我们来说是一个非常重要的数字。10是我们大多数人拥有的手指或脚趾的数目,因而我们人类已经适应了以10为基础的数字系统. 我们通常使用的数字系统称为以10为基础的数字系统或十进制。这个数字系统对我们来说非常自然,因而我们很难想像出还有其他的数字系统。如果人类不是有那么多只手指,我们数数的方式就会有所不同,数字10就可能代表别的东西了。当我们明白了10可以指只有两只鸭子的时候,也就可以解释开关、电线、灯泡、继电器(或干脆就叫计算机)是怎样表示数字的了。
如果人类像螃蟹那样,每只手上只有4个手指会怎样呢?我们可能永远都不会想到要发明一种以10为基础的数字系统的问题,取而代之的是我们可能会认为数字系统基于8是正常、自然、合理、必然的,是毫无疑问的,是非常合适的。这时,就不能称之为十进制了,得将它称作为以8为基础的数字系统或八进制。
如果数字系统是以8为基础组织起来的,就不需要这样的一个符号:9
把这个符号拿给任何一只螃蟹看,都会有同样的反应:“那是什么?它是干什么用的?”如果再仔细想一会儿的话,你会发现连这样的一个字符也不需要:8
因为在十进制数字系统中,没有专门用来表示10的符号,所在在八进制数字系统中,也没有专门用来表示10的符号。
在十进制数字系统中数数的方式是0、1、2、3、4、5、6、7、8、9,然后是10。在八进制数字系统中数数的方式是0、1、2、3、4、5、6、7,然后是什么呢?我们已经没有符号可用了,唯一的一个有意义的可用符号是10,的确是那样。在八进制数中, 7之后紧接着的数字是10,但是10并不是指人类的手指那么多的数目。
假定我们是海豚,并且必须用两鳍来数数, 则这个数字系统就是基于2的数字系统或二进制的。这样似乎只需要两个数字,即0和1。现在, 0和1已是你要处理的全部问题,需要练习一下才能习惯使用二进制数。二进制数最大的问题是数字用完得很快。
是的,在二进制中,1后面的数字是10。这是令人惊讶的,但也并不奇怪。无论使用哪种数字系统,当单个位的数字用完时,第一个两位数字都是10。在二进制系统中,可以这样来数数:
0 1 10 11 100 101 110 111 1000
这些数看起来好像很大,实际上并不是这样。更准确地说二进制数长度增长的速度要快过二进制数增大的速度,这有点像用牙签吃东西,刺的块很小且做起来很费力,吃一顿饭要花很长时间。
我们在写十进制中比较大的数字时,通常每三个数字之间留一点儿空隙,这样,我们一看就知道这个数的大概数值。例如,当你看到数字1 2 0 0 0 0 0 0时,你可能不得不去数其中0的个数,但如果看到的是120 000 000,则马上就能知道是一亿两千万。
二进制数的位长度增加得特别快。例如,一亿两千万的二进制表示为:
1 0 11 0 111 0 0 0 11 0 11 0 0 0 0 0 0 0 0。为了让它更易读,通常是每四个数字之间用连字符或空格来分开。例如; 1 0 11 - 0 111 - 0 0 0 1 - 1 0 11 - 0 0 0 0 - 0 0 0 0。
不可能找到比二进制数字系统更简单的数字系统了。二进制数字系统架起了算术与电之间的桥梁。我们所看到的开关、电线、灯泡、继电器等物体都可以表示二进制数0和1:
电线可以表示二进制数字。有电流流过电线代表二进制数字1;如果没有,则代表二进制数字0。
开关可以表示二进制数字。如果开关闭合,代表二进制数字1;如果开关断开,代表二进制数字0。
灯泡可以表示二进制数字。如果灯泡亮着,代表二进制数字1;如果没亮,代表二进制数字0。
电报继电器可以表示二进制数字。继电器闭合,代表二进制数字1;继电器断开,代表二进制数字0。
可见,二进制数与计算机密切相关!
大约在1 9 4 8年,美国数学家John Wilder Tukey (生于1 9 1 5年)提前认识到二进制数将在未来几年中随着计算机的流行而发挥更大的作用。他决定创造一个新的、更短的词来代替使用起来很不灵活的五音节词—binary digit。他曾经考虑用b i g i t或b i n i t,但最后还是选用了短小、简单、精巧且非常可爱的单词bit (比特)来代替binary digit这个词。
为什么引入八进制数和十六进制数?
二进制数书写冗长、易错、难记,而十进制数与二进制数之间的转换过程复杂,所以一般用十六进制数或八进制数作为二进制数的缩写。
二. 2进制的运算
1.二进制的加减乘除运算
在二进制中, 只有两个数码0和1, 它有如下的加法和乘法
0+0=0
0+1=1
1+0=1
1+1=10
0*0=0
0*1=0
1*0=0
1*1=1
规则和十进制数的运算规则类似(不同的是1+1=10), 但比十进制的加法表和乘法表要简单得多.
我们知道, 在十进制里是根据"逢十进一", "借一当十"的法则进行的. 而在二进制里, 我们只要根据"逢二进一", "借一当二"的法则, 就可以对二进制数进行加减乘除算术运算了.
11011
* 101
--------------
11011
11011
--------------
10000111
使用二进制, 乘法的速度提高了, 因为如果乘数是1, 可以将被乘数不变地写在相应的位置上, 又可以将乘数中接连的几个0跳过不用.
2.二进制的逻辑加乘非运算
除了加减乘除算术运算外, 还有一种是逻辑运算, 分别为逻辑加, 乘, 非.
逻辑加是按位运算的, 只是没有进位; 逻辑乘也是按位运算; 逻辑非则是按位取反.
对于这三种逻辑运算, 在计算机内有三种基本的逻辑线路, "与"门, "或"门和"非"门, 通常称为门电路.
"或"门是完成逻辑加运算, "与"门是完成逻辑乘运算, "非"们是完成逻辑非运算.
如果规定有信号表示1, 无信号表示0, 那么或, 与, 非门就能完成逻辑加, 乘, 非三种运算了.
此外还有一些派生的逻辑运算, 如“异或”运算是实现“必须不同, 否则就没有”这种逻辑的一种运算。
例如: 异或运算1010与0110, 结果是1100.
1010
0110
-------
1100
而计算机中二进制加减乘除算术运算可以用门电路组成的逻辑线路来实现.
三.门电路的逻辑线路如何实现二进制加减乘除算术运算
所有的二进制运算都可以用与,或,非这三个基本的门来实现.而逻辑电路则是这三个基本门的组合,用来计算特定的功能,不同的运算可以选择不同功能的逻辑电路来实现.
现已加法为例说明一下:
二进制加法的进位表
+进位 0 1
0 0 0
1 0 1
和与门的运算结果, 完全一致. 怎么样? 我们可以用一个与门表示二进制加法的进位, 而用或门表达二进制的加法, 或门不能表达的进位正好用与门弥补, 这样一个完美的加法器就诞生了. 而能计算两个1位的加法和并进位的叫半加器; 能计算两个3位的加法和并进位的叫全加器.
四.不同进制之间的转换
我们用计算机处理问题时,我们输入的数字一般都是十进制数, 可是计算机并不懂得十进制,因此我们必须先把它转化成二进制数才能被计算机所接受, 同理, 计算机计算出来的结果都是二进制数字,我们人类读起来又很不方便,因此,也需要将二进制数转换成人们习惯的十进制数,这样每次计算的背后,都有着一次十->二进制, 二->十进制之间的转换,虽然我们不必明白这里面的道理照样能使用计算机,但是对于想搞清楚计算机背后原理的人来说,弄懂它就很必要了,下面就看看不同进制数之间的转换问题.
1.十进制数与二、八、十六进制数之间的转换
1.1十进制数转换成二、八、十六进制数
整数部分, 除基取余, 如除(2,8,16)取余.
1.2 二、八、十六进制转换成十进制
按权展开.
2.二进制数与八进制数之间的转换
2.1 二进制数转换成八进制数
3位一组, 然后按权展开,加到一起即可.
2.2八进制数转换成二进制数
每个8进制数字用3位2进制数表示, 然后连在一起即可.
3.二进制数与十六进制数之间的转换
3.1 二进制数转换成十六进制数
4位一组, 然后按权展开,加到一起即可。
3.2十六进制数转换成二进制数
每个数字用4位2进制数表示, 然后连在一起即可.
4.小数部分的转换
乘基取整法, 分别用基数 R(R=2、8或16)不断地去乘N的小数,直到积的小数部分为零(或直到所要求的位数)为止, 每次乘得的整数依次排列即为相应进制的数码。最初得到的为最高有效数字, 最后得到的为最低有效数字。
1. R进制→十进制
(1)方法:人们习惯于十进制数,若将R进制数转化为等值的十进制数,只要将R进制数按位权展开, 再按十进制运算即可得到十进制数,即按照幂级数展开。
(2)举例:
例2.1.3 将二进制数(11011.101)2转换成十进制数。
解:(11011.101)2=1×24+1×23+0×22+1×21+1×20+1×2-1+0×2-2+1×2-3
=16+8+0+2+1+0.5+0+0.125
=(27.625)10
例2.1.4 将八进制数(136.524)8转换成十进制数。
解:(136.524)8=1×82+3×81+6×80+5×8-1+2×8-2+4×8-3
=64+24+6+0.625+0.03125+0.0078125
=(94.6640625)10
例2.1.5 将十六进制数(13DF.B8)16[=(13DF.B8)H]转换成十进制数。
解:(13DF.B8)16=1×163+3×162+13×161+15×160+11×16-1+8×16-2
=4096+768+208+15+0.6875+0.03125
=(5087.71875)10
2. 十进制→R进制
(1)方法:将十进制数转换为R进制数,需将十进制数的整数部分和小数部分分别进行转换,然后将它们合并起来。
十进制整数转换成R进制数采用逐次除以基数R取余数的方法:
(a)将给定的十进制整数除以R,余数作为R进制的最低位(LSB).
(b)把前一步的商再除以R,余数作为次低位。
(c)重复(b)步骤,记下余数,直至最后商为零,最后的余数即为R进制的最高位(MSB)。
十进制纯小数转换成R进制数,采用小数部分乘以R取整数的方法:
(a)将给定的十进制纯小数乘以R,乘积的整数部分作为R进制小数部分的最高位;
(b)把第一步乘积的小数部分继续乘以R,乘积的整数部分作为R进制小数次高位;
(c)重复(b),直到乘积的小数部分为0或达到一定的精度为止。
注:由精度确定小数位数的方法
因为R进制一位小数达到的精度为R-1,n小数达到的精度为R-n,故小数的位数n应满足:
R-n≤给定精度
n取满足上式的最小整数。
(2)举例
例2.1.6 把十进制数(25)10转换成二进制数。
解:由于二进制基数为2,所以逐次除以2取其余数(0或1):
所以
(25)10=(11001)2
例2.1.7 将十进制数(25)10转换成八进制数。
解:由于基数为8,逐次除以8取余数:
所以
(25)10=(31)8
例2.1.8 将十进制小数(0.375)10转换成二进制数。
解:
(0.375)10=(0.011)2
例2.1.9 将十进制小数(0.39)10转换成二进制数,要求精度达到2-10。
解:由于要求精度达到0.1%,2-10<0.1﹪,所以需要精确到二进制小数10位。
0.39×2=0.78 b-1=0
0.78×2=1.56 b-2=1
0.56×2=1.12 b-3=1
0.12×2=0.24 b-4=0
0.24×2=0.48 b-5=0
0.48×2=0.96 b-6=0
0.96×2=1.92 b-7=1
0.92×2=1.84 b-8=1
0.84×2=1.68 b-9=1
0.68×2=1.36 b-10=1
所以
(0.39)10=(0.0110001111)2
例2.1.10 将十进制小数(0.39)10转换成八进制数,要求精确到0.1%。
解:由于8-4<0.1﹪,所以需要精确到八进制小数的4位 0.39×8=3.12 b-1=3
0.12×8=0.96 b-2=0
0.96×8=7.68 b-3=7
0.68×8=5.44 b-4=5
所以
(0.39)10=(0.3075)8
把一个带有整数和小数的十进制数转换成R进制数时,将整数部分和小数部分分别进行转换,然后将结果合并起来,例如,将十进制数(25.375)10转换成二进制数,其结果为(11001.011)2
3.模为2n的不同进制之间的转换
(1)方法:由于3位二进制数构成1位八进制数码,4位二进制数构成1位十六进制数码。故模为2m和2n不同进制之间转换可将2m进制数转换成二进制,再将二进制转换成2n进制。
(a)2m进制转换为2进制只需将2m进制的数码转换为对应的二进制数即可。
(b)二进制转换为2n进制时,对于整数部分,从低位向高位每n位二进制转换成对应的2n进制数码,如位数不够,可在前面补零;对于小数部分,从高位向低位,每n位二进制转换为对应的2n进制数码,如位数不够,在后面补零。
(2)举例:
例2.1.11 把二进制数 (110100.001000101)2 转换为八进制。
二进制数 110 100 001 000 101
八进制数 6 4 1 0 5
(110100.001000101)2=(64.105)8
例2.1.12 把二进制数(110100.001000101)2=(64.105)8转换为十六进制
二进制数 11 0100 0010 0010 1000
十六进制数 3 4 2 2 8
(110100.001000101)2=(34.228)16