进制的概念:
因为不可能为每个数值都创造一个符号,所以需要用基本数字组合出复合的 数值,这样就有了进制的概念。 其实所有进制都是人为的创造,都是用来计数方便的。现在最常用的进制是 十进制,当然其它的进制也在使用中。例如“半斤八两”这个成语,就反映了古 代一斤等于十六两的概念,也就是十六进制计数方式。 计算机编程中常用的进制有二进制、八进制、十进制和十六进制,十进制还 是最主要的表达形式。
在编程中,大家书写的数值默认为十进制。
对于进制,有两个最基本的概念:
基数和运算规则。
l 基数 基数指一种进制中组成的基本数字,也就是不能再拆分的数字。例如十进制是 0-9,二进制是 0 和 1,八进制是 0-7,十六进制是 0-9,A-F(大小写均可)。或 者可以简单的这样记忆,假设是 n 进制的话,基数就是[0,n-1]的数字,基数的 个数和进制值相同,十进制有十个基数,依次类推。
l 运算规则 运算规则就是进位或借位规则,这个类似于一般计算机书籍中位权的概念,例如 对于十进制来说,该规则是“满十进一,借一当十”,也就是低位的数字满十了 向高位进一,从高位借到的一,相当于低位上的十。其它的进制也是这样,对于 二进制来说,就是“满二进一,借一当二”,八进制和十六进制也是这样。
在数学上表示一个数字是几进制,通常使用如下格式:[数值]进制数,例 如[10]2 表示二进制数值 10。
二进制 二进制是计算机内部数据表示的形式,所以学习计算机编程必须熟悉二进 制。
熟悉二进制有以下几个用途:
l 更容易理解计算机的数据存储方式 ,计算机内部的很多转换,例如数据类型之间的强转,都可以用二进制解释最终的 结果的值。
l 二进制的运算速度高 二进制的运算速度比十进制高的多。例如求 2 的 n 次方,通过移位实现的效率比 数学方法高效。
l 使用二进制数值进行数据存储 以二进制的形式存储数值,一个是比较节约资源,可以使用二进制的位来存储信 息,例如常见的硬件控制信息,都是二进制的形式进行提供的。
如前所述,二进制包含 0 和 1 两个基数,运算规则是“满二进一,借 一当二”,下面简单的介绍一下二进制的计数方式。
例如十进制的 0-9 用二进制进行表达,则依次是: 0,1,10,11,100,101,110,111,1000,1001 说明:数值之间使用逗号进行间隔。
下面是二进制的一些基本运算结果:
l 加法运算 0 + 0 = 0 0 + 1 = 1 1 + 0 = 1 1 + 1 = 10
l 减法 0 – 0 = 0 0 – 1 = -1 1 – 0 = 1 1 – 1 = 0
l 乘法 0 × 0 = 0 0 × 1 = 0 1 × 0 = 0 1 × 1 = 1
l 除法 0 / 0 无意义 0 / 1 = 0 1 / 0 无意义 1 / 1 = 1
以下是一些符合的表达式: 110 + 111 = 1101 这些基本的运算结构在实际开发中一般不会直接用到,但是通过这些 内容可以加深对于二进制概念的理解。
二进制和十进制之间的转换 由于计算机内部的数据是以二进制进行表达的,而十进制又是日常生 活中最常用的进制,所以它们之间经常需要进行转换。下面介绍一下转换的方式。
十进制转换为二进制 十进制整数转换为二进制有三种方法,分别是除二取余、计算器转换 和经验法。十进制小数的转换方法最后做简单的介绍。
1. 除二取余法 除二取余法是转换时的最基本方法,也是最通用的方法。
规则为:使用十进制和 2 去除,取每次得到的商和余数,用商继续和 2 相除,直到商为零为止,第一次 得到的余数作为二进制的低位,最后一次得到的余数作为二进制的高位,由余数 组成的数字就是转换后二进制的值。例如十进制的 13 转换为二进制的计算步骤 如下: 商 余数 13 / 2 = 6 1 6 / 2 = 3 0 3 / 2 = 1 1 1 / 2 = 0 1 则计算的最终结果就是 1101。
2. 计算器转换 Windows 操作系统中的计算器也可以很方便的实现进制之间的转换。在程序菜单 中附件子菜单中打开计算器,从打开的计算器的查看菜单中,选择“科学型”, 输入你要转换的十进制的数字,然后界面上数字显示框西侧的“二进 制“,则转换后的数值就直接显示在计算器中。
3. 经验法 对于二进制熟悉以后,那么计算十进制对应的数字可以通过一些基本的数学变换 来实现。
在使用经验法以前,必须熟记 2 的 0-10 次方对应的十进制的值,依次 是: 1,2,4,8,16,32,64,128,256,512,1024 则转换一些特殊的数字时可以极大的提高转换速度,例如数字 65,则可以这样 转换: 65 = 64 + 1 64 对应的二进制形式为 1000000 1 对应的二进制形式为 1 则 65 的二进制形式为 1000001 这个只适合转换一些特殊的数字,适应性没有除二取余法广泛。
十进制小数的转换采用的一般方法是乘二取整法。
规则为:对于小数 部分先乘二,然后获得运算结果的整数部分,然后将结果中的小数部分再次乘二, 直到小数部分为零为止,则把第一次得到的整数部分作为二进制小数的高位,后 续的整数部分作为地位就是转换后得到的二进制小数。
需要说明的是,有些十进 制小数无法准确的用二进制进行表达,所以转换时符合一定的精度即可,这也是 为什么计算机的浮点数运算不准确的原因。
例如 0.25 转换为二进制小数的步骤如下:
整数部分 0.25 × 2 = 0.5 0 0.5 × 2 = 1.0 1 则 0.25 转换为二进制小数为 0.01 如果一个十进制数字既有整数部分,也有小数部分,则分开进行转换 即可。
二进制转换为十进制 二进制转换为十进制采用的方法是:
数字乘位权相加法。下面先以十 进制为例来说明该方法,例如十进制数字 345的值,5的位权是 1,4的位权是 10, 3 的位权是 100,则有如下表达式成立: 345=5 × 1 + 4 × 10 + 3 × 100, 这就是数字乘位权相加法的原理。
其实对于十进制整数的位权很有规则,从右向左第 n 位的位权是十的 (n-1)方,例如个位是 10(1-1),十位是 10(2-1),依次类推。那么二进制整数的 位权规律和这个一致,也就是从右向左第 n 位的位权是二的(n-1)方。 例如二进制整数 1011 转换为十进制的表达式为: [1011]2 = 1 × 20 + 1 × 21 + 0 × 22 + 1 × 23 = 1 + 2 + 0 + 8=11 而对于二进制的小数,也是采用一样的方法,只是二进制小数的位权 规则为,小数点后第一位小数的位权是 2 的-1 次方,第二位是 2 的-2 次方,依 次类推。
例如二进制小数 0.1101 转换为十进制小数的表达式为 [0.1101]2=1 ×2-1 + 1 ×2-2 + 0 × 2-3 + 1 × 2-4 = 0.5 + 0.25 + 0 + 0.0625=0.8125 同理,如果二进制包含整数和小数部分,则分开进行转换即可。
二进制和八进制、十六进制之间的转换 虽然二进制是计算机内部的数据表达形式,但是由于二进制基数太少, 则导致数字比较长,为了简化数字的书写,就创建了八进制和十六进制。八进制 和十六进制就是对二进制的简化,所以二进制到八进制和十六进制的转换非常简 单。 二进制整数转换为八进制的方法是“三位一并“,也就是从右侧开始, 每 3 位二进制数字转换为八进制的一位,依次类推,因为二进制的三位数字可以 表达的区间是 000-111,刚好和 0-7 重合。
例如: 二进制的 10111 转换为 8 进制为:最后三位 111 转换为 7,前面的数 字 10 转换为 2,则转换后得到的八进制数字为 27。 二进制整数转换为十六进制的方法是“四位一并“,例如 10111 转换 为十六进制是 0111 转换为 7,1 转换为 1,则转换后得到的十六进制数字是 17。
二进制小数转换为八进制的方法也是“三位一并“,只是转换时从小 数的高位开始,也就是小数的左侧开始。例如 0.10111 转换为八进制是 101 转换 为 5,110 转换为 6,则转换得到的八进制小数为 0.56。
需要特别注意的是,小 数最后如果不足三位,一定要在后续补零以后再进行转换。 二进制小数转换为十六进制的方法也是“四位一并”,只是转换时从小 数的高位开始。例如二进制小数 0.10111转换为十六进制小数为,1011转换为 b, 1000 转换为 8,则转换后得到的十六进制是 0.b8。
如果二进制数包含整数和小数部分,则分开进行转换。