01我们不是在把数“变掉”

上一篇我们把十进制数写成了二进制。 现在要反过来:看到一串二进制,算出它表示的十进制数。

但要先记住:数值没有改变,改变的只是写法。

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

02先找出每一位的位值

二进制从右往左,每一位的位值依次是: 1、2、4、8、16、32……

也可以写成: 2⁰、2¹、2²、2³、2⁴、2⁵……

2⁴16
8
4
2
2⁰1

03把值为 1 的位加起来

现在来看 1101₂。 每一位都像是在回答一个问题: “这个位值要不要算进去?”

1 位值 8
1 位值 4
0 位值 2 不要
1 位值 1
1×8 + 1×4 + 0×2 + 1×1 = 13

04完整算一个例子

101101₂ 转成十进制。

二进制位 1 0 1 1 0 1
位值 32 16 8 4 2 1
要不要算 不要 不要
32 + 8 + 4 + 1 = 45
101101₂ = 45₁₀

05还有一种更快的算法

当二进制很长时,每次都写出 1、2、4、8、16……也可以, 但还有一种常见的计算方法: 从左到右,不断“乘 2,再加下一位”。

仍然用 101101₂

开始 1
读到 0 1×2 + 0 = 2
读到 1 2×2 + 1 = 5
读到 1 5×2 + 1 = 11
读到 0 11×2 + 0 = 22
读到 1 22×2 + 1 = 45

06怎样检查有没有算错?

你可以用上一篇学过的方法反过来检查: 把得到的十进制数再转换回二进制。

我们算出 101101₂ = 45₁₀
再检查 45 45 = 32 + 8 + 4 + 1 → 101101₂

07这些方法有没有边界?

有。我们这一篇讨论的是普通非负二进制整数

现在的方法

适合 0、1、1011、110010 这类非负二进制整数

带符号整数

计算机里常用补码,需要结合固定的位数一起解释

二进制小数

小数点右边的位值会变成 1/2、1/4、1/8……

你已经知道了什么

  • 二进制转十进制并没有改变数值,只是把同一个数换成十进制写法。
  • 二进制从右往左的位值是 1、2、4、8、16、32……
  • 最直观的方法是把所有值为 1 的位对应的位值加起来。
  • 1101₂ = 8 + 4 + 1 = 13₁₀。
  • 101101₂ = 32 + 8 + 4 + 1 = 45₁₀。
  • 还可以从左到右使用“当前结果 × 2 + 下一位”的方法快速计算。
  • 这两种算法本质相同,都是二进制位值展开的不同写法。
  • 本篇方法针对非负整数;带符号整数和二进制小数还需要额外规则。

下一个问题: 现在我们已经会在十进制和二进制之间转换了, 那文件大小里常见的 KB、MB、GB、TB 到底有多大? 下一篇:KB、MB、GB、TB 到底有多大?