计算机的硬件基础是数字电路,只有低电平和高电平两种稳定状态的信号,所以使用二进制。
计算机的数制有很多种:
二进制、四进制、八进制、十进制、十六进制、三十二进制
通常使用最为广泛的是二进制和十六进制。其中十进制就是我们平时看到的数字。
计算机中为了便于物理存储,采用二进制表达数值。二进制的特点如下:
逢2进1,由0和1两个数码组成,基数为2,各个位权以$ 2^k $表示。
1、二进制的加法,根据“逢二进一”规则,二进制数加法的法则为:
0+0=0
0+1=1+0=1
1+1=0 (进位为1)
1+1+1=1 (进位为1)
2、二进制的减法,根据“借一有二”的规则,二进制数减法的法则为:
0-0=0
1-1=0
1-0=1
10-1=1 (借位为1)
一般乘法和除法基本很少会用到,这里不再叙述。
十六进制数的基数是16,共有16个数码:0、1、2、3、4、5、6、7、8、9和A、B、C、D、E、F(可为小写),逢16进位,各个位的位权为16k。
十六进制数的加减运算也类似十进制,但注意逢16进位1,借1当16。
3F+4A=89,个位F+A=19进1,所以个位是9,十位3 + 4 + 1 = 8,所以等于89.
这里的后缀字母 H(或小写 h)表示十六进制形式表达的数据。(常用来表示地址、数据、指令代码)
在开发中,我们接触最多的就是进制的转换,下面会大致的讲解。
二进制转十进制
二进制转为十进制要从右到左用二进制的每个数去乘以2的相应次方,小数点后则是从左往右。
其中首位是0表示正整数,首位是1则为负整数,正整数可以直接换算,负整数则需要先减一取反再换算。
计算机内部数的字节单位是固定长度的,在位数不够时会在高位补0。
如要想二进制00110转十进制,因为以0开头,所以这是正整数,计算如下所示:
\(0 * 2^0 + 1 * 2^1 + 1 * 2^2 + 0 * 2^3 + 0 * 2^4\) = 6
如果想二进制11001转十进制,因为以1开头,所以是负整数,需要先减一取反再换算。取反结果:00111
\(1 * 2^0 + 1 * 2^1 + 1 * 2^2 + 0 * 2^3 + 0 * 2^4\) = - 7
十进制转二进制分为整数转二进制,和小数转二进制。
1、整数转二进制,采用除2取余,逆序排列法:
首先用2整除一个十进制整数,得到一个商和余数
然后再用2去除得到的商,又会得到一个商和余数
重复操作,一直到商为小于1时为止
然后将得到的所有余数全部排列起来,再将它反过来(逆序排列)
假设我们需要将42转为二进制:
42 / 2 = 21 ... 0;
21 / 2 = 10 ... 1;
10 / 2 = 5 ... 0;
5 / 2 = 2 ... 1;
2 / 2 = 1 .... 0;
1 / 2 = 0 ... 1;
得到结果010101再取反得到二进制数:101010。
2、小数转二进制,采用乘2取整,顺序排列法
用2乘十进制小数,可以得到积,将积的整数部分取出
再用2乘余下的小数部分,又得到一个积,再将积的整数部分取出
重复操作,直到积中的小数部分为零,此时0或1为二进制的最后一位,或者达到所要求的精度为止
例如将0.125转为二进制:
0.125 * 2 = 0.25 ------0
0.25 * 2 = 0.5 ------0
0.5 * 2 = 1.0 ------1
当小数部分为0就可以停止乘2,然后正序排序就构成了二进制的小数部分:0.001
如果小数的整数部分有大于0的整数时,需要将整数和小数部分分别转为二进制,再合二为一。
比如8.125转二进制,使用8转二进制为1000,使用0.125转二进制为0.001,合起来就是1000.001
比如二进制转十六进制是取四合一法、十进制转十六进制是除16取余,然后逆序排列,所以关于其他进制的转换这里不再叙述。
BCD码(Binary-Coded Decimal),用4位二进制数来表示1位十进制数中的0~9这10个数码,是一种二进制的数字编码形式,用二进制编码的十进制代码。
BCD码也称二进码十进数,BCD码可分为有权码和无权码两类。