https://zhuanlan.zhihu.com/p/195657163
┇铺垫
二进制,简单来说,是一种运算规则,每一位达到“二”就进一位,故称为“二” “进” 制。在我们日常计算里每一位到“十”进一位的十进制,类比一下(如9+1=10),在二进制里的“进位”,1+1应该等于10(“个位”2变0进“十位”1)。
但有一点得注意,上面二进制运算结果“10”在十进制里还是二,而不是十。
┇正题
在学习二进制与十进制相互转换时,会学到下面的转换方法:
- 十进制转二进制
将十进制表示的数除以二取余数,再将上次运算的商除以二取余数,不断重复,直到商为0结束。最后把余数从后往前依次排列出新的数。
例如:10
10÷2=5······0(❶)
5÷2=2······1(❷)
2÷2=1······0(❸)
1÷2=0······1(❹)
把余数从后往前排,便是1010(❹❸❷❶)
- 二进制转十进制
将二进制里的数从最左位开始分别乘以2ⁿ(n表示这一位的右边还有几位,最后一位n=0),最后把 各个 位计算后的结果 相加。
例如:1010
1×2³ + 0×2² + 1×2¹ + 0×2⁰ = 10
那么问题来了,为什么这样计算就可以达到效果呢?以及为什么要有“从后往前”,“乘以2ⁿ”这些奇怪的方式?
有一种思维方式叫比较推理
我们拿平时最熟悉的十进制来说。
比如“1234”,我们可以把它变形为1×10³+2×10²+3×10¹+4×10⁰,结果还是1234。那么刚刚二进制的“1010”表示的1×2³ +0×2²+1×2¹+0×2⁰ 和上面的式子非常相似。不妨假设,二进制转换十进制的运算实质和这个一样。
一个非负整数可以理解为有多少个1相加
在1×10³+2×10²+3×10¹+4×10⁰这个式子中,10³是表示个位进位到千位要加1的个数多少,如3000就可以表示为3×10³,或者说有3000个1相加。同理后面的也是如此。
那么不难想象在1×2³ +0×2²+1×2¹+0×2⁰里2³,2²,2¹,2⁰也表示是从个位进位到该位要加1的个数多少。
再详细一点
二进制 0 1 10 11 100 101 110 111 1000 ··
十进制0 1 2 3 4 5 6 7 8 ···
二进制中,从一位到两位要加2个1,从一位到三位要加4(2²)个1,从一位到四位要加8(2³)个1,这很容易就可以推出后面的情况。而且很容易理解,因为每一位从0到1再到0要经过两次,那么使这一位变化的要计算两次。
在十进制转二进制中,其实是对上面二进值转十进制的逆向运算
如之前的10÷2=5······0
我们可以把10改写成1×2³ +0×2²+1×2¹+0×2⁰,那么就可以很容易明白,在除以2后,10变成了1×2² +0×2¹+1×2⁰ + 0 前面的部分就是商5,后面的0就是余数。再把1×2² +0×2¹+1×2⁰除以2,5就变了1×2¹+0×2⁰ + 1,前面部分商就是2,后面的1就是余数。同理后面类似
这些余数之所以可以表示为二进制表示中相对应位的值,就是因为将这些个值反过去依次乘二乘回去就会变成原来式子。
至于为何把余数“从后往前”排列,就是因为这是在二进制转十进制的运算结构基础上而来的。越先余的数,除二的次数越少,那么它变化原来的情况乘二次数就越少,那么根据二进制转十进制里的运算结构,就排在最后边。
这就是我对于二进制与十进制相互转换的理解,其目的就是为了让大家熟悉这之间的进位的实质与这些公式背后的缘由。当然这个其实并不全面,这里只涉及到非负整数的情况,至于其它方面,则还需要其他的东西来进行,这里就不再写了(我懒)