01我们不是在把数“变掉”
上一篇我们把十进制数写成了二进制。 现在要反过来:看到一串二进制,算出它表示的十进制数。
但要先记住:数值没有改变,改变的只是写法。
02先找出每一位的位值
二进制从右往左,每一位的位值依次是: 1、2、4、8、16、32……
也可以写成: 2⁰、2¹、2²、2³、2⁴、2⁵……
03把值为 1 的位加起来
现在来看 1101₂。 每一位都像是在回答一个问题: “这个位值要不要算进去?”
1×8 + 1×4 + 0×2 + 1×1
=
13
04完整算一个例子
把 101101₂ 转成十进制。
32 + 8 + 4 + 1 = 45
05还有一种更快的算法
当二进制很长时,每次都写出 1、2、4、8、16……也可以, 但还有一种常见的计算方法: 从左到右,不断“乘 2,再加下一位”。
仍然用 101101₂:
1
1×2 + 0 = 2
2×2 + 1 = 5
5×2 + 1 = 11
11×2 + 0 = 22
22×2 + 1 = 45
06怎样检查有没有算错?
你可以用上一篇学过的方法反过来检查: 把得到的十进制数再转换回二进制。
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 到底有多大?