分享

程序员应该了解的计算机知识(二)——数制系统

 风箫易水ap72ax 2017-04-17

引言

众所周知,计算机系统使用的是二进制数制系统,其所能识别的机器码和指令代码都是用的是由0和1组成的序列。而日常生活中我们使用的都是十进制数制系统,计算机为什么只能使用二进制系统,这与其组成结构有关,我们知道计算机内部都是电子元件组成,而电子元件的状态(例如:通电和断电等)往往有相对的两面性,使用二进制更容易解释其电子元件的状态和特征。

提到数制系统,那么何为数制系统?日常生活中大多使用什么数制系统?二进制数制系统又是怎么回事儿?且看下文分解。

数制系统

关于数制系统纯粹是一种数学理论,这里笔者使用一种小学数学的方式来简单介绍一下。

1.关于数制系统

数制是用一种固定的符号和统一的规则来表示数值的方法,就是一种计数的规则。常见的数值系统有二进制、八进制、十进制、十六进制等。其中计算机使用的是二进制数制系统,现实生活中常用的是十进制数制系统。其实有一点了解的可以看出它们都是使用一种进位的方式进行计数,例如二进制逢二进一,十进制逢十进一,这种方式称为进位制,也成为进位记数法,是一种计数方式,可以使用有限的数字符号表示所有的数值。可使用的数字符号的数目称为基数或者底数,基数为n,即可称n进位制,也可称为n进制。

对于数制系统而言,常使用数码、基数、位权和因子等术语进行描述。

数码是数制中表示基本数值大小的不同数字符号。例如十进制有十个数码,分别为0、1、2、3、4、5、6、7、8、9;二进制则有两个数码,分别是0和1。

基数,也称底数,是数制中使用数码的个数。通常情况下使用基数来定义数制系统。例如十进制的基数为10,称为十进制数制系统,二进制的基数为2,称为二进制数制系统。

位权是数码在不同位置上的倍率值,即数制中某一位上的1所表示的数值的大小(所处位置的价值)。例如:十进制中的123,1的位权为100,2的位权为10,3的位权为1;二进制中10,1的位权为2,0的位权为1。对于一个n进制的数值,整数部分第i位(以小数点为原点向左)的位权为n的i-1次方,即n(i-1),而小数部分为第j位(以小数点为原点向右)的位权为n的-j次方,即n(-j)。(所在的n表示从小数点为原点,向两边衍生。)如图:十进制的2…5.0…5分析如下(…表示省略数字)

215219425.png

其实每一位数码所表示的数值大小等于该数码本身乘以位权。例如在十进制中可以使用个位、十位、百位、千位、万位…,十分位、百分位、千分位、万分位…来表示位权,个位就是100,十位就是101,…十分位就是10-1

因子是一种倍数关系,如果整数n除以m,结果是无余数的整数,那么就称m是n的因子,n是m的倍数。只有当被除数、除数、商均为整数,余数为零才成立。

经过上面的介绍,可以简单的整理一下数值系统中数值的表示方法。对于一个i位整数,j位小数的n进制数值可以使用加权系数展开式表示为:

K=(AiAi-1…A2A1.A1A2…Aj-1Aj)n

=Ai×ni-1+Ai-1×ni-2+…+A2×n1+A1×n0+.+A1×n-1+A2×n-2+…+Aj-1×n-(j-1)+Aj×n-j

其中i表示整数位数,其为从小数点左边第一位开始计算,依次为i=1,i=2,…;j表示小数位数,其为从小数点右边第一位开始计算,依次为j=1,j=2,…;A表示该进制数中的数码值;Ai表示整数部分的第i位数码值,例如i=1,则表示小数点左边第一位数码;Aj表示小数部分的第j位数码值,例如j=1,则表示小数点右边第一位数码;n为底数。

2.常见数制系统介绍

  • 二进制

二进制(Binary)是以2为基数,0、1为数码的进制系统,缩写为B或者BIN。二进制是由两个基本数字0和1组成,计算特点是“逢二进一”,“借一当二”。二进制数制系统常用于计算机等电子设备中数据的传输或存储,因为二进制中只有两个字符0和1,可以表示元器件的不同稳定状态;二进制的运算简单。

  • 八进制

八进制(Octal)是以8为基数,0、1、2、3、4、5、6、7为数码的进制系统,缩写为O或者OCT。八进制的计算特点是“逢八进一”,“借一当八”。八进制数制系统常用于计算机的计算中,适用于12位、36位等或其它位数为3的倍数的计算机系统。

  • 十进制

十进制(Decimal)是以10为基数,0、1、2、3、4、5、6、7、8、9为数码的数制系统。十进制的计算特点是“逢十进一”,“借一当十”。十进制是最常用的数制系统。

  • 十六进制

十六进制(Hex)是以16为基数,0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F为数码的进制系统,缩写为H或者HEX。十六进制的计算特点是“逢十六进一”,“借一当十六”。十六进制数制系统常用于计算机高级编程语言中,常用于对大数据的表示。

对于各个进制的运算这里不做多的介绍,记住“逢N进一”或者“借一当N”即可。只需要了解其加法和加法运算即可,其他的运算均可分解为加减法运算进行。

3.数制系统之间的相互转换

数制系统之间的相互转换或许是一个重点。但是也纯粹的是数学知识,不懂的话就好好的学学数学。这里简单的归纳一下常用的方法。(具体的例子省略,请自行安装规则演练。)

3.1.低进制转高进制

对于任意一个n进制的数值转换为m进制(m>n)的数值时可以使用按权求和法,即将n进制的数值按n进制位权展开后,按照m进制的加法规则进制求和,等到的结果就该n进制数值使用m进制表示的数值。转换方法如图:

223605281.png

该种方法适用于低进制转换为高进制数值,图中m必须是大于n的整数。使用算术表达式可将该方法表示为:

(AiA(i-1)…A2A1.A1A2…Aj-1Aj)n=Ai×ni-1+Ai-1×ni-2+…+A2×n1+A1×n0+.+A1×n-1+A2×n-2+…+Aj-1×n-(j-1)+Aj×n-j=(…)m

3.2.高进制转低进制

对于任意一个n进制的数值转换为m进制(m<>

1.基数除法(除m取余法)——类似于短除法,即使用m去除十进制整数部分,一直到商为零时结束,将每一步得到的余数按反方向排列,则得到整数部分的m进制表示形式。看下面的表达式提取(除以m)的思路:

(K)10=m0×(Ai×mi-1+Ai-1×mi-2+…+A2×m1+A1×m0)

 =m1×(Ai×mi-2+Ai-1×mi-3+…+A2×m0)A1

 =m2×(Ai×mi-3+Ai-1×mi-4+…+A3×m0)A2A1

 ……

 =mi-1×(Ai×m0)Ai-1A2A1

 =AiAi-1A2A1

这只是一个模拟过程,每一步都除以一个m(提取一个m)得到余数Ai,将余下的整数进行拼接。表达式中“”表示拼接符号。

2.基数乘法(乘m取整法)——即使用m去乘十进制小数部分,一直到乘积没有小数即小数部分为零(或者出现循环体或者得到要求的精度位置)时结束,将每一步得到的乘积的整数部分按正方向排列,则得到小数部分的m进制表示形式。看下面的表达式乘以m的思路:

(K)10=m0×(A1×m-1+A2×m-2+…+Aj-1×m-(j-1)+Aj×m-j)

 =A1m1×(A2×m-1+…+Aj-1×m-(j-1)+1+Aj×m-j+1)

 =A1A2m2×(A3×m-1+…+Aj-1×m-(j-1)+2+Aj×m-j+2)

 ……

 =A1A2Aj-1mj-1×(Am0)

 =A1A2Aj-1+Ajmj×1

 ……

这只是一个模拟过程,每一步都乘以一个m(提取一个m)得到整数结果Aj,积的小数部分则继续参与计算,最后将得到的整数进行拼接。表达式中“”表示拼接符号。

关于n进制转换为m进制(m<>

233416964.png

该种方法适用于高进制转换为低进制数值,图中m必须是小于n的整数。

3.3.特殊方法介绍

关于n进制的数值与nK(K为正整数)进制的数值之间的转换,它们之间存在幂(次方)的关系,可以使用特殊的划位方法进行快速转换。设m=nK,则n与m的关系为nK=m1,则n与m之间存在为的对应关系,即n中的K位对应m中的1位。

对于nK(K为正整数)进制的数值转换为n进制的数值时,可以直接将nK(K为正整数)进制数值中的每一位转换为n进制对应的数值,转换过程实质是使用以n为除数,每一位为被除数的除乘法运算,得到每一位对应n进制的K位结果,最后将结果连接起来就是nK(K为正整数)进制数值对应的n进制数值。

对于n进制的数值转换为nK(K为正整数)进制的数值时,可以对n进制的数值进行K位划分,具体划分规则分为小数部分和整数部分:整数部分——从小数点左边第一位开始算,每数K位进行划分,直到左边不足K位(左边补零直到满足K位)或者刚好为K位结束。然后将划分的每K位转换为nK进制的数值,转换过程实质是使用每K位按n进制进行位权展开,然后按nK进制的加法规则进行求和得到每位对应的nK进制的数值,将得到每一位结果从左到右连接起来则为nK(K为正整数)进制数值的整数部分。小数部分——从小数点右边第一位开始算,每数K位进行划分,直到右边不足K位(右边补零直到满足K位)或者刚好为K位结束。然后将划分的每K位(不包含小数点)转换为nK进制的数值,转换过程实质是使用每K位按n进制进行位权展开,然后按nK进制的加法规则进行求和得到每位对应的nK进制的数值,将得到每一位结果从左到右连接起来则为nK(K为正整数)进制数值的小数部分。最后将得到的结果通过小数点连接起来。可以用下图来表示这个过程:

234159691.png

该方法只适合具有n进制的数值与nK(K为正整数)进制的数值之间的转换。

计算机中数制系统——二进制

二进制系统是以0和1为数码,2为基数的数制系统。计算机采用的就是二进制数制系统,由于二进制数制系统只存储0和1两个数码,可以明确的表示电子元件的两种状态,而且二进制的运算简单,即可算术运算也可以进行逻辑运算。在计算机中使用二进制数码序列和数位来表示其不同的数值,同一个数码在不同的数位上或同一个数位上不同的数码可以表示不同的数值。

1.二进制的运算

在计算机中,二进制数制系统支持两种运算方式:算术运算和逻辑运算。算术运算包括加减乘除法运算,逻辑运算包括与或非等运算。在算术运算中遵循“逢二进一,借一当二”的原则;而逻辑运算是模拟电路元件的运算,主要用于二进制位码的比较上。

1.1.算术运算
  • 加法法则:0+0=0;0+1=1+0=0;1+1=10(进位)

  • 减法法则:0-0=0;10-1=1(借位);1-0=1;1-1=0

  • 乘法法则:0×0=0;0×1=1×0=0;1×1=1

  • 除法法则:0÷1=0;1÷1=1

1.2.逻辑运算
  • 逻辑非(NOT)运算使用符号“ˉ”表示,在操作数上加上该符号表示对该数的各位进行逻辑非运算。规则如下:235131120.png235235243.png。即非0为1,非1为0。

  • 逻辑与(AND)运算又称为逻辑乘运算,使用符号“×”或“·”或“∧”表示,在两个操作数之间使用该符号表示对当前两个操作数的各位进行逻辑与运算。规则如下:0∧0=0;0∧1=0;1∧0=0;1∧1=1(有点像乘法运算)。即当操作数有一个为0时则结果为0;同时为1时则结果为1。

  • 逻辑或(OR)运算又称为逻辑加运算,使用符号“+”或“∨”表示,在两个操作数之间使用该符号表示当前两个操作数的各位进行逻辑或运算。规则如下:0∨0=0;0∨1=1;1∨0=1;1∨1=1(有点像加法运算)。即到操作数有一个为1则结果为1;同时为0则结果为0。

  • 逻辑异或(XOR)运算使用符号“-∨”表示,在第一个操作数前加上“-”符号,第二个操作数前加上“∨”表示对当前两个操作数的各位进行逻辑异或运算。规则如下:-0∨0=0;-0∨1=1;-1∨0=1;-1∨1=0(有点想减法运算)。即当操作数运算的相同时结果为0,不同时结果为1。

或许你会发现,对应任意一个二进制数(二进制序列)来说,如果末尾(右边第一位)的数码为1则该二进制数表示的是奇数,可以被2n-1整除;如果末尾(右边第一位)的数码为0则该二进制数表示的是偶数,可以被2n整除;将一个二进制数左移一位(右边补0)的结果是该数的2倍,即该数乘以2的结果;将一个无符号的数右移一位(左边补0)的结果是概述的1/2倍,即该数除以2的结果。(这个特点是一种算法的体现,具体不做多个解释)

2.二进制的转换

2.1.二进制与十进制的转换

1.二进制转换为十进制

将二进制数值按位权进行展开并按十进制的进行求和运算,得到的结果即使十进制的数值。整数部分的幂为正,小数部分的幂为负。

2.十进制转换为二进制

将十进制数值的整数部分进行基数除法运算,即除以2,记下得到的余数作为二进制数值的最低位;得到的商如果不是0则继续除以2,记下得到的余数……;依次做除法直到得到的商为0停止,组合每一次除法的余数即是二进制数值的整数部分。将十进制数值的小数部分进行基数乘法运算,即乘以2,继续得到结果的整数部分作为二进制数值的最高位;得到的积如果还包含小数(没有达到指定的精确度)则用该小数部分继续乘以2,记下得到结果的整数部分……;依次做乘法直到得到的积不包含小数部分(或达到指定的精度)停止,组合每一次乘法结果的整数部分即为二进制数值的小数部分。最后以小数点进行拼接即可。

2.2.二进制与其它进制的转换

二进制与其他进制的转换可以借助十进制为桥梁,先将二进制数值转换为对应的十进制数值,然后再将十进制数值转换为对应的数制系统的数值。或者先将其他进制数值转换为对应的十进制数值,然后再将十进制数值转换为对应的二进制数值。

二进制转换为2K(K为正整数)进制可以使用位划分法进制转换,以二进制数值中的小数点为原点,分别将整数部分和小数部分按K位进行划分,不足K位可以补0;然后再将每一个K位转换成一个2K进制的数值(按二进制进行位权展开,按2K进制进行求和运算);最后将每一位数字按顺序进行连接即得到对应的2K进制的数值。2K(K为正整数)进制转换为二进制时可以使用按位转换法进行转换,将2K进制的每一位转换为K位的二进制数值(使用以2为基数的基数除法进行转换),然后将得到的数值按顺序连接起来即为对应的二进制数值。

附录:二进制、八进制、十进制、十六进制数值转换对照表

二进制八进制十进制十六进制
00000000
00010111
00100222
00110333
01000444
01010555
01100666
01110777
10001088
10011199
10101210A 或 a
10111311B 或 b
11001412C 或 c
11011513D 或 d
11101614E 或 e
11111715F 或 f
10000201610

总结

数制系统的一种相对性的概念,而且任何一种数制系统都有其独到的用处。生活中都是用的标准的十进制,而如果要入行IT,至少要对二进制有所了解,如果要进军编程必须要对八进制、十六进制有所了解。本文中略有提到规则,其只是数码个数不同、位权不同而已,可使用位权求和法将低进制数值转换为高进制数值;使用基数乘除法将高进制数值转换为低进制数值,其实这都是数学概念。计算机使用的是二进制,相对比较简单。

再说后话,本篇的内容或许对大多数的人来说都是“班门弄斧”,笔者是半道入行IT的,对高数、计算机基础都了解甚少(不明说,你懂得),这里笔者想用一种通俗的方式来表述个人总结的知识。所以希望大家不要见笑,多多喷墨……

本文出自 “阿酷呆” 博客,请务必保留此出处http://akudy.blog.51cto.com/2277883/1298406

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多