进制

  本文没有重点讲述进制转化的计算,因为这些在很容易查询到,而是重点讲述我怎么理解进制以及它们之间的转化。

进制的理解

  假设有这么一个十进制数\(12345_{10}\),那么它可以分解为\(12345=1 \times 10^4 + 2 \times 10^3 + 3 \times 10^2 + 4 \times 10^1 + 5 \times 10^0\),也就是说数字1,2,3,4,5在每一位都有自己代表的不同的值,就好像4在十位,就表示\(40_{10}\)
  接着我们引入"位值"的概念,即:同一个数字,放在不同的数位上,代表不同大小的“量”。例如:十进制中,百位上的1表示100,十位上的1表示10)。对于一个k进制的数\(12345_{k}=1 \times k^4 + 2 \times k^3 + 3 \times k^2 + 4 \times k^1 + 5 \times k^0\)

进制转换

2进制转10进制

  通过上面,我们已经知道,\(1011_2=1 \times 2^3 + 0 \times 2^2 + 1 \times 2^1 + 1 \times 2^0\),那么如何将\(1011_2\)转化位10进制呢,“位值”告诉我们每一位都有自己所代表的量,如何将这些量相加运算时是使用进制k,那么它得到的结果就是k进制。如\(1011_2=1 \times 2^3 + 0 \times 2^2 + 1 \times 2^1 + 1 \times 2^0 = 8_{10} + 0_{10} + 2_{10} + 1_{10}=11_{10}\),也就是说\(1011_2\)的十进制就是11。

10进制转2进制

  接着我们将\(11_{10}\)转化为二进制,但是有人就会说,\(11_{10}=1 \times 10^1 + 1 \times 10^0\),在运算中运用二进制去算太麻烦了,首先我得将10换为二进制,还要做乘法和加法。有没有更加简单的方法呢?
  答案肯定是有的。通过秦九韶公式我们都知道,\(1011_2=1 \times 2^3 + 0 \times 2^2 + 1 \times 2^1 + 1 \times 2^0 = ((1 \times 2 + 0) \times 2 + 1) \times 2 + 1\),如果设\(1011_2 = k_{10}\),那么由上面的秦九韶公式我们就可以知道\(k \div 2\)的余数1恰好是\(1011_2\)中的最低位数,商为\((1 \times 2 + 0) \times 2 + 1\),如果不断用商除以2得到的余数便是\(1011_2\)上从低到高的每一位。这也是课本或者教科书上10进制转2进制的方法的原理。
  通过这个原理,我们也可以就是10进制数(含小数)转化为2进制的原理。现在我们将\(11.46_{10}\)转化为2进制数。通过前面我们都已经知道\(11.46_{10}\)的整数部分\(11_{10}=1011_2\),所以我们只需要考虑小数部分。我们先类比一下“位置”,\(1.23_{10} = 1 \times 10^0 + 2 \times 10^{-1} + 3 \times 10^{-2}\),那么\(0.101_2=0 \times 2^0 + 1 \times 2^{-1} + 0 \times 2^{-2} + 1 \times 2^{-3}\)。所以我们可以假设\(0.46_{(10)}=0.a_1a_2...a_{n_{(2)}}=a_1 \times 2^{-1} + a_2 \times 2^{-2}+...+a_n \times 2^{-n}\),同样,0.46除以\(2^{-1}\)(也就是0.46 × 2)得到的余数(得到的积,积≥1,取1,反之,取0)便是\(a_1\),而商(若积>1,将积-1作为下一个乘数)就是\(a_2 \times 2^{-2}+...+a_n \times 2^{-n}\),这样不断下去,就可以求出\(11.46_{10}\)的二进制数。
  我们都知道计算机是用二进制来存放数据的,如果二进制数是无限小数,那么计算机也无法用有限的位数来存,这便是浮点数出现偏差的原因之一。

2进制转16进制

  假设有这么一个8位的\(11011100_2=1 \times 2^7 + 1 \times 2^6 + 0 \times 2^5 + 1 \times 2^4 + 1 \times 2^3 + 1 \times 2^2 + 0 \times 2^1 + 0\times 2^0\),它的十六进制数为\(XY_{16} = X \times 16^1 + Y \times 16^0\),我们都知道\(16=2^4\),因此,我们可以修改等式,\(11011100_2=1 \times 2^7 + 1 \times 2^6 + 0 \times 2^5 + 1 \times 2^4 + 1 \times 2^3 + 1 \times 2^2 + 0 \times 2^1 + 0\times 2^0 = (1 \times 2^3 + 1 \times 2^2 + 0 \times 2^1 + 1 \times 2^0) \times 16^1 + (1 \times 2^3 + 1 \times 2^2 + 0 \times 2^1 + 0\times 2^0) \times 16^0\),由于\((1 \times 2^3 + 1 \times 2^2 + 0 \times 2^1 + 1 \times 2^0)_{16}=D_{16},(1 \times 2^3 + 1 \times 2^2 + 0 \times 2^1 + 0\times 2^0)_2 = C_{16}\),所以所求的数为DC。
  这也就是为什么2进制转化为16进制总是4个4个化为一组的原因。

16进制转为2进制

  通过2进制转化为16进制,我们知道16进制每个位上的数对应着4个二进制的数,所以我们可以这样求DC的二进制数,由\(D_{16}=13_{10}=1101_2\)\(C_{16}=12_{10}=1100_2\),所以\(DC_{16}=11011100_2\)

posted @ 2018-03-02 21:53  h_hg  阅读(479)  评论(0编辑  收藏  举报