跳到主要内容
CalcMax

十进制转二进制换算器

结果

10001

二进制

各位位值
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 一轮一轮除以二,直到商变成零

轮次除法商余数
117 ÷ 281
28 ÷ 240
34 ÷ 220
42 ÷ 210
51 ÷ 201

这是方法本身而不是一个结果,所以它固定用 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 加回来的结果。

算例

  1. 把 17 写成二进制

    1. 17 ÷ 2 = 8,余 1——把这个 1 写下来
    2. 8 ÷ 2 = 4,余 0
    3. 4 ÷ 2 = 2,余 0
    4. 2 ÷ 2 = 1,余 0
    5. 1 ÷ 2 = 0,余 1——商已经是零,到此为止
    6. 把余数从下往上读:1、0、0、0、1,也就是 10001

    默认值,也是展示方向的那一条:最先求出的余数是答案的最后一位。按求出的先后顺序读,得到的是反过来的答案——10001 反过来写还是 10001,纯属巧合,所以这条规则要看下一条例子才数得清。核对:16 + 1 = 17。

  2. 把一个字节写满,255

    1. 255 ÷ 2 = 127,余 1
    2. 127 ÷ 2 = 63,余 1——从这里开始,每一轮余下的都是 1
    3. 63 → 31 → 15 → 7 → 3 → 1,每一轮都余 1
    4. 1 ÷ 2 = 0,余 1——一共八轮
    5. 八个余数都是 1,从下往上读:11111111

    255 是一个八位字段能装下的最大值,原因就在这里:八个二进制位给出 2⁸ 种组合,其中最大的一种是全 1。同一件事的另一头是 256 写成 100000000——九位——那才是装不进一个字节的数。位值和是把整把尺子加了一遍,值得完整看一次。

  3. 一个 2 的幂,16

    1. 16 ÷ 2 = 8,余 0
    2. 8 ÷ 2 = 4,余 0
    3. 4 ÷ 2 = 2,余 0
    4. 2 ÷ 2 = 1,余 0
    5. 1 ÷ 2 = 0,余 1
    6. 从下往上读:一个 1 后面跟四个 0,也就是 10000

    2 的幂恰好只会产生一个 1,然后就停了,所以位值和塌成单独一项。这个形状值得记住:任何 2 的幂在二进制里都是一位 1 后面跟一串 0,这也是为什么字段宽度、页大小、缓冲区容量都以 2 的幂为单位。

  4. 前导零不改变数值

    1. 输入里的前导零挂在十进制数的最前面,不贡献任何东西
    2. 换算针对的仍然是 17,与第一条例子完全相同
    3. 两个输出都与那一条逐字相同

    输入侧收下前导零,是因为十进制数常常是从某处粘过来的、带着补位;而它们不改变任何东西:零个一百仍然是零个一百。反过来也一样,有时候补位是故意的——八位字段里的 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。数不熟的时候梯子更好用,因为它不需要任何可能算错的算术——反复除以二是机械的。两种办法最后落到同一串数字位,谁也不比谁更正确。

参考资料

相关计算器