十进制转二进制换算器
结果
二进制
- 各位位值
- 16 + 1
十进制转二进制换算器把一个整数从十进制改写成二进制。变的只是写法,数本身没有变,而把它写出来的方法是不断除以二:用二除这个数,留下余数,再用二除商,一直到商为零为止。余数就是二进制的数字位,但它们是倒着出来的——最后写下的那个余数才是答案的第一位。以 17 为例:17 ÷ 2 得 8 余 1,8 ÷ 2 得 4 余 0,4 ÷ 2 得 2 余 0,2 ÷ 2 得 1 余 0,1 ÷ 2 得 0 余 1。把余数从下往上读,是 1、0、0、0、1,所以 17 写成二进制是 10001。读余数的方向正是绝大多数错误发生的地方,这也是这一页把每一步除法都印出来、而不是只给一个答案的原因。一个位值就是一个 2 的幂,把答案按位值展开再相加,是核对这件事的办法:10001 里有一个 16 和一个 1,别的位都是 0,而 16 + 1 正好又是 17。数变短的时候方向同样重要:2 的幂这样的整数在二进制里是一位 1 后面跟一串 0,而比 2 的幂小一的数是清一色的 1,所以 15 是 1111、255 是 11111111。
把 17 一轮一轮除以二,直到商变成零
| 轮次 | 除法 | 商 | 余数 |
|---|---|---|---|
| 1 | 17 ÷ 2 | 8 | 1 |
| 2 | 8 ÷ 2 | 4 | 0 |
| 3 | 4 ÷ 2 | 2 | 0 |
| 4 | 2 ÷ 2 | 1 | 0 |
| 5 | 1 ÷ 2 | 0 | 1 |
这是方法本身而不是一个结果,所以它固定用 17,而上面的面板换算你输入的那个数。把余数那一列从下往上读,答案的数字位就按顺序出现了:1、0、0、0、1,也就是 10001。这一列必须倒着读,是因为每一次除法求出的是剩下那部分的最低位:第一轮定下的是个位,第二轮是二位,往后依次往左,所以轮次穿过答案的方向是从右到左。商变成零就可以停,是因为商为零意味着当前位置再往左没有任何一位是 1。表里有两个细节值得看:余数只可能是 0 或 1,不可能是别的,因为除数是二;以及商每一轮都缩到不足一半,所以即使是允许的最大输入,梯子也只有五十来行。要换算别的数,照着这四列在纸上走一遍即可——表告诉你列是什么,不告诉你你的数会是什么。
公式
17 ÷ 2 = 8 余 1 → 8 ÷ 2 = 4 余 0 → 4 ÷ 2 = 2 余 0 → 2 ÷ 2 = 1 余 0 → 1 ÷ 2 = 0 余 1 ⇒ 17 = 10001 = 16 + 1
- 17
- 要换算的那个整数,用十进制写。它必须是整数:小数点与千分位分隔符都会被拒收,而不是被四舍五入掉——这一族的页面统一只处理整数
- ÷ 2
- 反复执行的那一步。二是你要换进去的那个底,所以每一轮问的都是「里面有几个二」,而剩下来的那部分正好就是这一位上该写的数字
- 商
- 带进下一轮的那部分。商变成零就是停止的信号,它表示再往左的位都不需要了
- 余数
- 这一轮产生的数字位。除以二只可能余下 0 或 1,这正是答案是一串二进制数字、而不是别的符号的原因
- ⇒ 10001
- 把数字位从下往上拼起来的结果。第一个求出的余数是最右边那一位,最后一个求出的才是最高位——这是这套方法里唯一容易搞反的一步
- 16 + 1
- 把答案按位值读回来:10001 只在十六和一这两位上是 1,所以加起来又是 17。这就是页面上印出来的那道核对,它成立是因为一个二进制数的位值之和就是这个数本身
- 53 位
- 答案最长可以有多少位:五十三个二进制位,换成十进制是 9007199254740991。超过这个宽度,机器已经分不开相邻的两个整数,所以更大的输入会被拒收,而不是换成一个只是看起来对的答案
凡是需要手写出机器自己的写法,就会用到十进制转二进制。把几个小值打包进一个整数时,要先算清每个值占哪几位,而这件事从二进制写法的值本身开始:一个颜色通道、一组权限标志、配置寄存器里的一个位域。看数据手册的人遇到的是同一件事的另一面,因为手册上印的范围与掩码是十六进制或二进制写的,而它们对应的那个数通常是十进制。课程作业里这个方向往往是直接问的——把十进制转成二进制并把过程写出来——而这张除法梯子就是那个过程,一步一行。同一个换算还回答一些看起来不是换算的问题:这个量级的数要几位才够、比它大的 2 的幂是哪一个、为什么一个 8 位字段的范围是 0 到 255 而不是到 256。习惯心算的人多半不列梯子,而是拿 2 的幂去减——减掉能减的最大的那个,再对剩下的重复——这一页的输出同样支持这种做法:每减成功一次,那一位上就留一个 1,而答案旁边印的位值和就是那些 1 加回来的结果。
算例
把 17 写成二进制
- 17 ÷ 2 = 8,余 1——把这个 1 写下来
- 8 ÷ 2 = 4,余 0
- 4 ÷ 2 = 2,余 0
- 2 ÷ 2 = 1,余 0
- 1 ÷ 2 = 0,余 1——商已经是零,到此为止
- 把余数从下往上读:1、0、0、0、1,也就是 10001
默认值,也是展示方向的那一条:最先求出的余数是答案的最后一位。按求出的先后顺序读,得到的是反过来的答案——10001 反过来写还是 10001,纯属巧合,所以这条规则要看下一条例子才数得清。核对:16 + 1 = 17。
把一个字节写满,255
- 255 ÷ 2 = 127,余 1
- 127 ÷ 2 = 63,余 1——从这里开始,每一轮余下的都是 1
- 63 → 31 → 15 → 7 → 3 → 1,每一轮都余 1
- 1 ÷ 2 = 0,余 1——一共八轮
- 八个余数都是 1,从下往上读:11111111
255 是一个八位字段能装下的最大值,原因就在这里:八个二进制位给出 2⁸ 种组合,其中最大的一种是全 1。同一件事的另一头是 256 写成 100000000——九位——那才是装不进一个字节的数。位值和是把整把尺子加了一遍,值得完整看一次。
一个 2 的幂,16
- 16 ÷ 2 = 8,余 0
- 8 ÷ 2 = 4,余 0
- 4 ÷ 2 = 2,余 0
- 2 ÷ 2 = 1,余 0
- 1 ÷ 2 = 0,余 1
- 从下往上读:一个 1 后面跟四个 0,也就是 10000
2 的幂恰好只会产生一个 1,然后就停了,所以位值和塌成单独一项。这个形状值得记住:任何 2 的幂在二进制里都是一位 1 后面跟一串 0,这也是为什么字段宽度、页大小、缓冲区容量都以 2 的幂为单位。
前导零不改变数值
- 输入里的前导零挂在十进制数的最前面,不贡献任何东西
- 换算针对的仍然是 17,与第一条例子完全相同
- 两个输出都与那一条逐字相同
输入侧收下前导零,是因为十进制数常常是从某处粘过来的、带着补位;而它们不改变任何东西:零个一百仍然是零个一百。反过来也一样,有时候补位是故意的——八位字段里的 00010001 与 10001 是同一个数,两种写法这一页都收。
局限
这一页只换算整数。小数点会被拒收而不是被四舍五入,所以 17.5 换算不了——要收下小数就得再定一条规则,说清保留几位、最后一位怎么舍入,而这一族里每一页都把这条界线画在同一个位置。千分位分隔符也不收,所以写 1500 而不是写 1,500;逗号在有些语言里是小数点,在两读之间猜一个比直接要求写清楚更糟。输入的上下界是 9007199254740991,也就是五十三个二进制位;更大的值机器存不精确,会带着一条说明被拒收,而不是换成一个看上去像答案的东西。前导零与前导负号都收。下面那张表印的是 17 的除法梯子,它是固定的,不跟着你输入的数变——结果面板回答你的数,参考表展示的是方法。反过来的方向,也就是把二进制数读回十进制,是另一页的事,这一页不对结果做任何运算。
常见问题
- 怎么手算十进制转二进制?
- 用二除,写下余数,再用二除商,重复到商为零为止。17 得到的余数依次是 1、0、0、0、1——每一轮求出的是从右往左的下一位,所以要从下往上读,得到 10001。另一种很多人觉得更快的做法是拿 2 的幂去减:减掉能减的最大的那个,在那一位置 1,再对剩下的重复。两种做法得到的数字位一样,而这一页印出来的位值和就是第二种做法剩下的东西。
- 为什么余数要从下往上读?
- 因为第一次除法问的是最小那一位,不是最大那一位。用二除 17,问的是里面有几个二、剩下多少——而剩下的这部分就是个位,因为它是凑不出一个二的那部分。下一轮对二问同样的问题,余下的就是二位。所以轮次是从最右边那一位往左走的,按写下的先后顺序读,得到的是反过来的答案。
- 带小数的十进制数能换算吗?
- 这一页不行。它只收整数,所以 17.5 会被拒收而不是被四舍五入。二进制里的小数是完全定义好的——小数点右边那些位分别是一个二分之一、四分之一、八分之一——但收下它们就得再决定保留几位、最后一位怎么舍入,而这一族的每一页都只换算整数。这样界线在整个族里都在同一个位置,不会出现同一个值这一页收、那一页不收的情况。
- 这一页最大能换算多大的十进制数?
- 9007199254740991,它的二进制写法是五十三个 1。这个上限不是这一页自己定的:到这个宽度,机器已经分不开相邻的两个整数,再长的答案也不可信,所以会带着说明被拒收,而不是照换不误。同一个上界在读取页上表现为五十三位的长度限制,在十六进制那里是十四位——它们是同一个界的三种写法。
- 为什么除了二进制数还要印一个位值和?
- 为了让人能核对,而不是只能照单全收。二进制数是你要的东西,但光看 10001 分不出它对不对。把它占着的位值加起来——这里是 16 和 1——得到的正是你输入的那个数,也就是这个换算反着走了一遍。如果加回来不是你的数,那串二进制就是错的,而这一点不用第二个工具就能看出来。
- 有没有比反复除法更快的办法?
- 常见的数有:把 2 的幂背到 1024 左右,然后拿最大的那个去减。17 减掉 16 剩 1,所以一次除法都不用写,答案就是 10001。数不熟的时候梯子更好用,因为它不需要任何可能算错的算术——反复除以二是机械的。两种办法最后落到同一串数字位,谁也不比谁更正确。
参考资料
- Binary number——二进制的位置记法、位值,以及二进制与十进制之间的换算 — Wolfram MathWorld(美国)
- Number base——一个数的值为什么取决于它所在的位置与所用的底,以及同一个量如何写成不同的进制 — Wolfram MathWorld(美国)
- Powers of two——1、2、4、8、16…这个序列,也就是除法梯子从下往上读出来的那串位值,OEIS 编号 A000079 — OEIS Foundation Inc.(美国)
- 教育部关于印发义务教育课程方案和课程标准(2022 年版)的通知——该通知的附件清单第 5 项是《义务教育数学课程标准(2022 年版)》;十进制与二进制之间的换算是该课标数与代数领域的内容,原文与学段要求以该附件为准 — 中华人民共和国教育部