十进制数转二进制数
前言
十进制是以十为基础的数字系统。
"满十进一,满二十进二, ...",以此类推。
十进制数中每一个位上可能使用的数值为(1,2,3,4,5,6,7,8,9,0),个位数上的数字表示未满十的数,即含有多少个10^0;十位数上的数表示含有几个十,即含有多少个 10^1;百位数的数表示含有多少个100,即含有多少个 10^2。以此类推,一个 N(代表正整数)位十进制数中,从右往左第 i 位上的数字表示含有多少个 10^(i-1)
(i 代表正整数,起始值为 1),这些值(每个位上的数字乘以表示的数量级)的和即构成了这个十进制数的值。
那么 4 位的正整数 hjkl (l 代表个位数上的数字,k 代表十位数上的数字,j 代表百位数上的数字,h 代表千位数上的数字) 就可以这样表示 h*10^(4-1) + j*10^(3-1)+ k*10^(2-1)+ l*10^(1-1)
。
同理对于二进制(每一个位上可能使用的数为 0,1)来说,一个 N(代表正整数)位二进制数中,从右往左第 i 位上的数字表示含有多少个 2^(i-1)
, i 代表正整数,起始值为 1。
十进制整数转二进制
前言讲到十进制与二进制位上代表的含义,那十进制数转二进制数就简单了。
将一个十进制数转二进制,其实就是一个数值从一种表示方式转换到另一种表示方式。即由原来每个位上表示的含有几个 10^(i-1)
转化为每个位上含有几个 2^(i-1)
,i 表示从右往左第 i 位,起始值为 1 。
辗转相除法
整数部分:除以2,取出余数,商继续除以2,直到得到0为止,将取出的余数逆序。
为什么是取余数,因为余数表示 “未凑满上一位,溢出来的那一部分”
例子:
22 转二进制的计算过程
22 / 2 11 余 0
11/2 5 余 1
5 /2 2 余 1
2 /2 1 余 0
1 /2 0 余 1
得到22的二进制是10110
小技巧
一般算比较小的数字的话,就先找小于并且临这个数最近的2的N次方。然后依次。
比如 37
32 + 4 + 1
对应的就是 100101(32 16 8 4 2 1 有的写1,反之写0)。
浮点数转二进制
浮点数转二进制道理跟整数转二进制是一样的。但是有一点 需要注意的是,二进制浮点数的小数位,每一位(从左往右)表示的是 2^(-i)
,i 从 1 开始算起。
浮点数转二进制的时候,整数部分与小数位部分要分开计算转换。
小数部分:除以2的倒数相当于乘以2,取整,小数部分继续乘以2,取整,直到小数部分0为止,将整数顺序排列。
为什么是取小数部分继续运算呢?因为在每一次除以2的倒数得到的结果中,小数部分也是表示的是 “未凑满上一位高位,溢出来的那一部分”。注意在小数位中,每一位表示的数量级也是从左往右递减的。
例子:
0.8125 转二进制的计算过程
0.8125x2=1.625 取整1,小数部分是0.625
0.625x2=1.25 取整1,小数部分是0.25
0.25x2=0.5 取整0,小数部分是0.5
0.5x2=1.0 取整1,小数部分是0,
得到0.8125的二进制是0.1101。