虽然很基础的内容,不过还是经常会用到。自己有时候头晕,也会需要复习一下。

我们常用的数字是以10为基数的,也就是说我们有0到9十个数字来表达,当要表达超过9的数字时,我们进位,譬如9+1=10.

同理,二进制是以2为基数的数字系统,我们只能用0和1来表达数字,当大于1时,我们进位,譬如1+1=10(不能有2这个数字存在)

八进制:0到7来表达数字,7+1=10(不能有8)

十六进制:在数字表达里,我们只有0到9十个数字,但按照前面的理解,十六进制显然需要十六个字符来满足数字的表达,于是,在这个系统里,我们借用了英文字母A、B、C、D、E、F,分别表达10、11、12、13、14、15. 所以,我们的计算式里会出现:9+1=A(而不是10),9+7=10(没有比F更大的表达,所以要进位)

 

还是有点糊涂?下面做几个简单计算就知道怎么转换了。

从十进制转换至其它进制:

有一种很通俗易懂的计算方法——取余数,例如:

把十进制的123转换成二进制

123/2 = 61 余 1
61/2 = 30 余 1
30/2 = 15 余 0
15/2 = 7 余 1
7/2 = 3 余 1
3/2 = 1 余 1
1/2 = 0 余 1

把上面的余数从下往上排列起来:11110111,用Windows自带的计算器转换一下123到二进制,看看结果是不是一样?

 

把十进制123转换成八进制

同样用上面的方法,这次我们除以8(而不是2)

123/8 = 15 余 3
15/8 = 1 余 7
1/8 = 0 余 1

把上面的余数从下往上排列起来:173,Windows计算器获得的转换结果也是173

 

很容易吧?十六进制的计算也是一样的,我就不写出来了,但记得用ABCDEF来分别表达10到15这几个数字。方法虽然简单,但是计算会相当繁琐。如果在不借助计算器的前提下,要把十进制的1234567890转换成二进制,那恐怕会算到死~下面,我再介绍一种方法,是通过将十进制转换成十六进制,再转换成二进制的一个过程。

将数字1234567890转换成十六进制,用前面提供的方法,只需要7步:

1234567890/16 = 77160493 余 2
77160493/16 = 4822530 余 13
4822530/16 = 301408 余 2
301408/16 = 18838 余 0
18838/16 = 1177 余 6
1177/16 = 73 余 9
73/16 = 4 余 9
4/16 = 0 余 4

余数从下往上排列起来:499602D2,这个与计算器的结果是一致的。接下来,从十六进制转二进制就容易了:

4的二进制表达为0100(我在最前边补充一个0,为的是让二进制数字有4位,为什么?我一会儿解释)
9的二进制表达为1001
6的二进制表达为0110
0的二进制表达为0000
2的二进制表达为0010
D的二进制表达为1101(D也就是13)

我们现在将十六进制的数字499602D2分拆开来,将每一个数字单独用对应的二进制数字表示:

关于二进制、八进制、十六进制的计算和转换(Binary-Octal-Hex)_二进制

从左到右按顺序合并二进制数字:01001001100101100000001011010010,去除最左边第一位的0(这个0没有意义,譬如你不会写成001,而只写1),对比计算器获得的结果,是否一致?

此方法也适用于八进制转换二进制,不过在十六进制下,我们的二进制保留4位(不足时补0),而八进制下,我们的二进制保留3位(不足时补0),譬如:

八进制的123,转换成二进制得到001 010 011,合并后得到1010011.

 

现在你可能要问为什么十六进制和八进制可以这样转换到二进制,而十六进制要保留4位数,八进制只要3位数。这个我们可以这样理解:2^4 = 16, 2^3 = 8,可见,基数2的4次方为16,3次方为8,在同以2为基数时,我们可以做一个反向的计算。

 

当然,实际生活中,计算远没有那么复杂,除了上面的方法外,我们还可以列表:

关于二进制、八进制、十六进制的计算和转换(Binary-Octal-Hex)_8进制_02

上表是一个16位的二进制表,譬如我们要查找十进制数字123的二进制表达:64+32+16+8+2+1 = 123,对应上表,我们得到1x2^6 + 1x2^5 + 1x2^4 + 1x2^3 + 0x2^2 + 1x2^1 + 1x2^0,保留乘数前面0和1的部分,得到1 1 1 1 0 1 1,也就是123的二进制表达。这个表很方便,但也是需要一定计算的。

 

从其它进制转换为十进制

这个是需要比较大量计算的过程,通常我只建议一种方法,那就是将十六、八进制转换成二进制后,利用上面的表格进行计算。把对应数值加起来就可以了,譬如1101对应着8+4+0+1 = 13