01我们到底在转换什么?
“十进制变成二进制”听起来像把一个数变成了另一个数, 其实数值本身没有变,只是换了一种写法。
所以我们的任务其实是: 找到哪些二进制位应该写 1,哪些应该写 0。
02方法一:拆成 2 的幂
上一篇我们知道,二进制每一位从右往左的位值是: 1、2、4、8、16、32……
所以可以问: 13 能不能拆成这些位值的和?
13 = 8 + 4 + 1
对应到二进制位:
1
1
0
1
03方法二:不断除以 2
还有一种很常见的方法: 不断除以 2,并记录每次的余数。
还是用 13 来试:
13 ÷ 2 = 6 …… 1
余数 1
6 ÷ 2 = 3 …… 0
余数 0
3 ÷ 2 = 1 …… 1
余数 1
1 ÷ 2 = 0 …… 1
余数 1
1 → 0 → 1 → 1
但是这还不是最后答案。 要把余数从最后一次往第一次倒着读:
04为什么余数要倒着读?
关键在于: 每次除以 2 得到的余数,只会是 0 或 1, 它告诉我们当前这个数是偶数还是奇数。
余数是 0
说明当前最低位是 0
余数是 1
说明当前最低位是 1
第一次除法先找到最右边最低位, 然后把商继续除以 2, 才一步一步找到更高的位。
1
0
1
1
05再做一个完整例子
把十进制的 25 变成二进制。
除 2 取余
25 ÷ 2 = 12 …… 112 ÷ 2 = 6 …… 06 ÷ 2 = 3 …… 03 ÷ 2 = 1 …… 11 ÷ 2 = 0 …… 1倒着读余数
11001₂再用位值检查
16 + 8 + 1 = 25
06怎样检查自己有没有算错?
最简单的办法就是: 把算出来的二进制再按位值加回去。
1×16 + 1×8 + 0×4 + 0×2 + 1×1
=
25
07这些方法有没有边界?
有。我们这一篇讲的是非负整数怎样转换成普通二进制表示。
适合现在的方法
0、1、2、13、25、100 这类非负整数
负数
计算机里常用补码等方式表示,不能只在前面加一个负号就结束
小数
小数部分通常需要另一种“乘 2 取整”的思路
你已经知道了什么
- 十进制转二进制改变的是写法,不是数值本身。
- 可以用“拆成 2 的幂”来判断哪些二进制位应该是 1。
- 也可以不断除以 2,并记录每次余数。
- 除 2 取余时,第一个余数对应最低位,所以最终要把余数倒着读。
- 13₁₀ = 1101₂,因为 13 = 8 + 4 + 1。
- 25₁₀ = 11001₂,因为 25 = 16 + 8 + 1。
- 检查答案时,可以把二进制中所有为 1 的位值加起来,看是否回到原来的十进制数。
- 这一篇的方法针对非负整数;负数和小数需要额外的表示与转换规则。
下一个问题: 如果我们拿到一串二进制, 怎样一步一步把它变回熟悉的十进制? 下一篇:二进制怎样变回十进制?