在之前的文章中我们详细的说过了为什么计算机要采用二进制,也知道了在计算机中所有的程序最终都会被变成二进制。那么我们今天就来说一下二进制和十进制之间如果进行转换。
整数位
十进制转二进制
十进制转二进制分为整数部分和小数部分,在整数部分需要采用的方法是余数短除法,除以二(关于这一点需要解释,要转成几进制就除以几)。
例如我们有一个十进制数255,转二进制的过程如下所示:
255/2=127=====余1
127/2=63======余1
63/2=31=======余1
31/2=15=======余1
15/2=7========余1
7/2=3=========余1
3/2=1=========余1
1/2=0=========余1
从下至上倒叙看所有的数字,十进制数255对应的二进制数就是11111111 B 。
B表示二进制,O表示八进制,D表示十进制,H表示十六进制
那么为什么是这样呢?
原理
二进制的基数为2,我们十进制化二进制时所除的2就是它的基数。这时候有一个概念就必须要说一下了,位权,或者权重。某进制计数制中各位数字符号所表示的数值表示该数字符号值乘以一个与数字符号有关的常数,该常数称为 “位权 ” 。位权的大小是以基数为底,数字符号所处的位置的序号为指数的整数次幂。十进制数的百位、十位、个位、十分位的权分别是10的2次方、10的1次方、10的0次方,10的-1次方。二进制数就是2的n次幂。
按权展开求和正是非十进制化十进制的方法。
二进制转十进制
刚才我们说了二进制转十进制的方法是按权展开求和,假设十进制整数A化得的二进制数为edcba 的形式,那么用上面的方法按权展开, 得
A=a(20)+b(21)+c(22)+d(23)+e(2^4)
小数位
十进制转二进制
小数位转换我们采用乘2取整 顺序排列 。具体做法是:用2乘十进制小数,可以得到积,将积的整数部分取出,再用2乘余下的小数部分,又得到一个积,再将积的整数部分取出,如此进行,直到积中的小数部分为零,此时0或1为二进制的最后一位。
但是乘法会出现乘不尽的情况,对于这些情况我们需要做的就是保留一定的精度,这也就是我们Java中float和double的区别,所谓的精度不一样就是小数位数不一样。
0.625=(0.101)B
0.625*2=1.25======取出整数部分1
0.25*2=0.5========取出整数部分0
0.5*2=1==========取出整数部分1
原理
假设一十进制小数B化为了二进制小数0.ab的形式,同样按权展开,得
B=a(2-1)+b(2-2) 因为小数部分的位权是负次幂,所以我们只能乘2,得2B=a+b(2^-1) 注意a变成了整数部分,我们取整数正好是取到了a,剩下的小数部分也如此。
值得一提的是,小数部分的按权展开的数位顺数正好和整数部分相反,所以不必反向取余数了。
二进制小数转十进制
二进制小数转十进制使用的方法就是乘以2的负次幂,可以对照整数位来进行处理。
我不能保证每一个地方都是对的,但是可以保证每一句话,每一行代码都是经过推敲和斟酌的。希望每一篇文章背后都是自己追求纯粹技术人生的态度。
永远相信美好的事情即将发生。