二进制(binary)与十进制(denary)互换要靠位值:8 位数从左到右各列的值是 128、64、32、16、8、4、2、1。二进制转十进制,就是把有 1 的那些列的值加起来。十进制转二进制,就是逐列判断这个位值放不放得下。
这个技能是数字与文字的表示的起点,后面的十六进制、二进制加法和位深度都会用到它。
二进制的位值怎么运作?
十进制里,345 表示 3 个百、4 个十和 5 个一,每一列是右边那列的 10 倍。二进制里每一列是右边那列的 2 倍,所以从右往左各列是 1、2、4、8、16、32、64、128。
| 列的值 | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
|---|---|---|---|---|---|---|---|---|
| 位 | 1 | 0 | 1 | 1 | 0 | 1 | 0 | 1 |
把每个 1 上面的值加起来:128 + 32 + 16 + 4 + 1 = 181。所以二进制 10110101 就是十进制 181。
十进制怎样转成二进制?
从最大的列开始往小的列走。每一列都问:这个值放得进剩下的数吗?
- 在八个空格上面写出八个列的值。
- 如果位值小于或等于剩下的数,写 1,并把它减掉。
- 如果不是,写 0,剩下的数不变。
- 一直做到最后一列。这时剩下的数应该是 0,这就是你的检查。
示范例子
把 183 转成 8 位二进制。
| 列 | 之前剩余 | 放得下? | 位 | 之后剩余 |
|---|---|---|---|---|
| 128 | 183 | 是 | 1 | 55 |
| 64 | 55 | 否 | 0 | 55 |
| 32 | 55 | 是 | 1 | 23 |
| 16 | 23 | 是 | 1 | 7 |
| 8 | 7 | 否 | 0 | 7 |
| 4 | 7 | 是 | 1 | 3 |
| 2 | 3 | 是 | 1 | 1 |
| 1 | 1 | 是 | 1 | 0 |
答案是 10110111。加回去检查:128 + 32 + 16 + 4 + 2 + 1 = 183,吻合,而且剩余最后是 0。
同样的方法怎样写成算法?
上面的表格就是这段伪代码所做的事。
DECLARE Number : INTEGER
DECLARE Place : INTEGER
DECLARE Bits : STRING
Number ← 183
Place ← 128
Bits ← ""
WHILE Place >= 1
IF Number >= Place
THEN
Bits ← Bits & "1"
Number ← Number - Place
ELSE
Bits ← Bits & "0"
ENDIF
Place ← Place DIV 2
ENDWHILE
OUTPUT Bits
追踪过程:
| Place | Number >= Place? | Bits | Number |
|---|---|---|---|
| 128 | 是 | “1” | 55 |
| 64 | 否 | “10” | 55 |
| 32 | 是 | “101” | 23 |
| 16 | 是 | “1011” | 7 |
| 8 | 否 | “10110” | 7 |
| 4 | 是 | “101101” | 3 |
| 2 | 是 | “1011011” | 1 |
| 1 | 是 | “10110111” | 0 |
Place = 1 之后,Place 变成 0,循环结束。输出是 10110111。你可以在 Python 推理沙盒用 print(format(183, "08b")) 和 print(int("10110111", 2)) 来验证。
要留意的错误
常见的失误是位值从错误的一端读起,把最左边的位当成 1。
题目: 把 110100 转成十进制。
错误做法: 1×1 + 1×2 + 0×4 + 1×8 + 0×16 + 0×32 = 11
6 位数从左边起各列是 32、16、8、4、2、1。正确做法是 32 + 16 + 4 = 52。避免这个错误的方法:在加任何东西之前,先把列的值写在位的上方,永远从右边的 1 开始,往左逐列翻倍。
自我检查
1. 把 00110110 转成十进制。
查看答案
有 1 的列:32、16、4、2。总和:32 + 16 + 4 + 2 = 54。
2. 把 200 转成 8 位二进制。
查看答案
128 放得下(剩 72)。64 放得下(剩 8)。32 不行,16 不行。8 放得下(剩 0)。4、2、1 不行。位是 1 1 0 0 1 0 0 0,所以是 11001000。检查:128 + 64 + 8 = 200。
3. 为什么 8 位寄存器存不下十进制数 256?
查看答案
8 位最大值是 11111111 = 255。数字 256 需要第九列,值为 256,所以需要 9 位。
接下来学什么
转换熟练之后,学用十六进制简短地写二进制,再做综合练习。Python 推理沙盒和伪代码追踪训练器可以让你测试自己的例子。
有些学生转换得慢但很准,到了考试却做不完。这正是我们的老师可以在线上一对一 Computer Science 补习中帮你处理的情况。