解释原理简单易懂 进制转换详解( 二 )


三、十进制转化为其他进制
由于整数部分和小数部分的处理方式是不同的 , 因此我们将分为两部分介绍 。主要以二进制为例展开讲解 。
1、 整数部分的转化
十进制转化为二进制的规则为什么是除以2反向取余数 , 直到商为0?
如下图所示:
1除以2时不够除 , 商为0余数为1
我将10D和展开后的1010B二进制数同时除以2 , 二进制数每一位的权重都减少了1 , 但是最后一位(最右边的一位) , 其数位为0无法在减少了(假如减1 , 那么数位就是-1 , 就成为小数点后一位了 , 然而我们想得到余数 , 并不想让结果为小数) , 余数就是最后一位的数码 。
当一个某进制的整数除以该数的基数 , 得到的余数就是数位为0(最低位或最后一位)的数码 。
本部分内容相当重要 , 十进制转换为其他进制的核心 , 所以我要尽可能详细的说明 。
为了方便理解 , 我们以十进制数1234为例
十进制数 , 基数为10
1234 = 1 * 103 + 2 * 102 + 3 * 101 + 4 * 100
两边同时除以基数10
1234 / 10 = 123 … 4
1 * 102 + 2 * 101 + 3 * 1004 * 100
从1234的角度看4除以10不够了 , 所以余数4
从展开式的角度看 , 其他数位都可以减一 , 但是最后一位的数位是0 , 无法减一了 , 所以余数4 * 100 = 4 , 或者认为是权重为104的系数4
也就验证了上面那句话 , 十进制数1234除以基数10 , 得到的余数就是(原数1234)数位为0的数码4 。
(内心OS:我个人觉得术语余数使用于展开式中 , 术语数位和数码适用于原数本身 。)
对于123 , 进行递归运算就好了 , 十进制数123除以基数10 , 得到的余数就是(原数123)数位为0的数码3 , 同时也是(原数1234)数位为1(倒数第二位)的数码3 。
回到最初的问题 , 十进制转化为二进制的规则为什么是除以2反向取余数 , 直到商为0?
现在可以解答了 , 
除以2是因为我们要转化为二进制数 , 二进制数的基数是2 , 
反向取余数 , 因为每次得到的余数其实是要转换为的二进制数的
最低的数码 , 换句话说最先得到的余数是最低位的数码 , 最后得到的余数是最高位的数码 , 所以要反向取余数
不知道我讲明白了没有 , 如果有问题欢迎评论区提出来 , 我很希望把这部分内容讲解清楚 。
2、小数部分的转换
十进制小数转化为二进制小数的规则为什么是乘以2取整 , 正向取整数?
如下图所示:
我们将0.625D和0.101B的展开式同时乘以2 , 二进制数的每一位权重都增加了1 , 原来的最高位的数位从-1变为了0 , 换句话说 , 该数码从小数部分的最高位变为了整数部分的最低位 , 该数码已经不属于小数部分了 。效果好像是小数点向右移动了一位 。
当一个某进制的小数乘以该数的基数 , 得到的整数部分的值(数位为0的数码)就是小数部分数位为-1(小数部分最高位)的数码 。其效果等同于小数点向右边移动一位
为了方便理解 , 我们以十进制小数0.123为例
0.123 = 1 * 10-1 + 2 * 10 -2 + 3 * 10-3
两边同时乘以基数10
1.23 = 1 * 100 + 2 * 10 -1 + 3 * 10-2
从1.23角度看 , 乘以10后的整数部分 , 就是原来小数的最高位