01我们到底在转换什么?

“十进制变成二进制”听起来像把一个数变成了另一个数, 其实数值本身没有变,只是换了一种写法。

十进制 13₁₀
=
二进制 1101₂

所以我们的任务其实是: 找到哪些二进制位应该写 1,哪些应该写 0。

02方法一:拆成 2 的幂

上一篇我们知道,二进制每一位从右往左的位值是: 1、2、4、8、16、32……

所以可以问: 13 能不能拆成这些位值的和?

16 8 4 2 1
13 = 8 + 4 + 1

对应到二进制位:

位值 8 4 2 1
要不要用 不要
写成二进制 1 1 0 1
所以 13₁₀ = 1101₂

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

但是这还不是最后答案。 要把余数从最后一次往第一次倒着读

1 1 0 1 所以 13₁₀ = 1101₂

04为什么余数要倒着读?

关键在于: 每次除以 2 得到的余数,只会是 0 或 1, 它告诉我们当前这个数是偶数还是奇数

0

余数是 0

说明当前最低位是 0

1

余数是 1

说明当前最低位是 1

第一次除法先找到最右边最低位, 然后把商继续除以 2, 才一步一步找到更高的位。

先找到 最低位 1
再找到 更高一位 0
继续 更高一位 1
最后 最高位 1

05再做一个完整例子

把十进制的 25 变成二进制。

除 2 取余

25 ÷ 2 = 12 …… 1
12 ÷ 2 = 6 …… 0
6 ÷ 2 = 3 …… 0
3 ÷ 2 = 1 …… 1
1 ÷ 2 = 0 …… 1

倒着读余数

11001₂

再用位值检查

16 + 8 + 1 = 25
25₁₀ = 11001₂

06怎样检查自己有没有算错?

最简单的办法就是: 把算出来的二进制再按位值加回去。

116
18
04
02
11
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 的位值加起来,看是否回到原来的十进制数。
  • 这一篇的方法针对非负整数;负数和小数需要额外的表示与转换规则。

下一个问题: 如果我们拿到一串二进制, 怎样一步一步把它变回熟悉的十进制? 下一篇:二进制怎样变回十进制?