在十进制中,个位的1代表100=1,十位的1代表101=10,百位的1代表102=100,所以
123=1×102+2×101+3×100
同样道理,在二进制中,个位的1代表20=1,十位的1代表21=2,百位的1代表22=4,所以
(A3A2A1A0)2=A3×23+A2×22+A1×21+A0×20
如果二进制和十进制数出现在同一个等式中,为了区别我们用(A3A2A1A0)2这种形式表示A3A2A1A0是二进制数,每个数字只能是0或1,其它没有套括号加下标的数仍表示十进制数。对于(A3A2A1A0)2这样一个二进制数,最左边的A3位称为最高位(MSB,Most Significant Bit),最右边的A0位称为最低位(LSB,Least Significant Bit)。以后我们遵循这样的惯例:LSB称为第0位而不是第1位,所以如果一个数是32位的,则MSB是第31位。上式就是从二进制到十进制的换算公式。作为练习,请读者算一下(1011)2和(1111)2换算成十进制分别是多少。
下面来看十进制怎么换算成二进制。我们知道
13=1×23+1×22+0×21+1×20
所以13换算成二进制应该是(1101)2。问题是怎么把13分解成等号右边的形式呢?注意到等号右边可以写成
13=((((0×2+13)×2+12)×2+01)×2+10
我们将13反复除以2取余数就可以提取出上式中的1101四个数字,为了让读者更容易看清楚是哪个1和哪个0,上式和下式中对应的数字都加了下标:
13÷2=6...10
6÷2=3...01
3÷2=1...12
1÷2=0...13
把这四步得到的余数按相反的顺序排列就是13的二进制表示,因此这种方法称为除二反序取余法。
计算机是用二进制表示数据的,因此程序员也必须习惯使用二进制,但二进制写起来太啰嗦了,所以通常将二进制数分成每三位一组或者每四位一组,每组用一个数字表示。比如把(10110010)2从最低位开始每三位分成一组,10、110、010,然后把每一组写成一个十进制数字,就是(262)8,这种表示方式数字的取值范围是0~7,逢八进一,称为八进制(Octal)。类似地,把(10110010)2分成每四位一组,1011、0010,然后把每一组写成一个数字,这个数的低位是2,高位已经大于9了,我们规定用字母A~F表示10~15,则这个数可以写成(B2)16,这种表示方式数字的取值范围是0~F,逢十六进一,称为十六进制(Hexadecimal)。所以,八进制和十六进制是程序员为了书写二进制方便而发明的简便写法,好比草书和正楷的关系一样。