跳到主要内容
CalcMax

二进制转十进制换算器

结果

11

十进制

各位位值
8 + 2 + 1

二进制转十进制换算器把用二进制写的数改写成同一个数的十进制写法,值不变,变的只是记法。规则其实你早就知道:十进制里的 352 是三乘一百加五乘十加二乘一,每一位的权重是它右边那一位的十倍;二进制里权重改成了两倍,所以从右往左依次是 1、2、4、8、16、32,而每一位上的数字只有 0 和 1。于是换算就是把写着 1 的那些位加起来,写着 0 的位不用管:1011 就是 8 加 2 加 1,等于 11。这一页把那个加法逐项印在答案下面,每一位 1 一项,因为心算时出错的正是这一步——漏掉一位,或者从错的那一头开始数。方向是从右往左,最右边那一位永远是一,与这个数有多长无关。这也是二进制换算器最常被用错的一格:同样几个数字从左边读起,答案会完全不同。

一个字节里每一位的位值,从最左边一直排到最右边

位位权该位的值
72⁷128
62⁶64
52⁵32
42⁴16
32³8
22²4
12¹2
02⁰1

这是换算时用的那把尺子,而且它是固定的:不随上面的输入改变,所以两者看起来对不上时并不矛盾。结果面板回答的是你打进去的那个数,表回答的是一个更一般的问题——一个字节里每一位值多少,而那正是手上还没有具体数字时先要问的事。从上往下读每次减半,从下往上读每次加倍,规律自己就出来了:最右边那位是 1,因为那是个位;挨着它的是 2,因为底是二;每往左一步就翻一倍。只列到八行,是因为人们真正会去换算的值都住在一个字节里——一个状态标志、一个颜色通道、一个权限掩码——而列到第五十三位会是一整屏没人读的数字。某个数置了哪几位,就是在这张表上读出来再加起来的,所以表和上面印出的那个加法说的是同样这八个位置的两种讲法。关于方向要提一句:这里的位号是从右往左数的,bit 0 是最后一位;一份从左边开始数位的文档会在每一行上都与这张表对不上,而它们说的是同一件事。

公式

1011 = 1×2³ + 0×2² + 1×2¹ + 1×2⁰ = 8 + 2 + 1 = 11

二进制
要读的那个数,用二进制写。它的数位只有 0 和 1,而整个数的值取决于每一位坐在哪里,不取决于一共有几位
2ⁿ
某一位的位值:二的自乘若干次,次数等于这一位离右端有多远(最右边那位算第零位)。于是这个序列是 1、2、4、8、16、32、64、128,每一步都是前一步的两倍
数字 × 2ⁿ
加法里的一项。由于数字不是 0 就是 1,乘法从不改变任何东西——写着 1 的位把它的位值整个贡献出来,写着 0 的位什么也不贡献,所以换算退化成把 1 所在的那些位挑出来
Σ
把每一项加起来。它就是整个换算过程:把置位的那几个位值相加,得到的就是这个数的十进制写法
8 + 2 + 1
把 0 那些项去掉之后的写法,也是笔算时的写法。1011 在 8、2、1 三个位置上是 1,在 4 那个位置上是 0,所以 4 从来不出现——看见它缺席正是重点,因为那一步最容易跟丢
53 位
输入最长可以是多少位:五十三个二进制位,也就是 9007199254740991。这是机器没法再区分相邻整数的宽度,更长的输入读不精确,所以会被拒绝而不是猜一个值给你

这个换算在读的方向上有两种用法。一种是拿到一个二进制值需要读懂它:调试器打印出来的状态字节、硬件寄存器的标志位、配置文件里的位掩码、网络工具的输出,或者一道要求写十进制答案的练习题。另一种是藏在普通数字背后的二的幂推理——这个数是不是二的幂、比某个数大的下一个二的幂是多少、存一个值要几位、一条若干位宽的总线能寻址多大范围——这些问题全都是看哪几位是 1 就能回答的。程序员在算子网掩码、把几个小值打包进一个整数、检查某个存下来的数开了哪些选项时,遇到的也是同一个加法。把位值写开的这个输出,还让这一页可以当教学工具用:进位规则与位权是两件在摊开之前看着像凭空规定的事,而让页面替你把那个加法写出来,书上的例题就变成了对自己答案的复核。凡是要手读二进制数的人,以及想知道答案为什么是这个数而不只是这个数是多少的人,都能从这里拿到东西。

算例

  1. 读 1011

    1. 在四个数字下面从右往左写上位值:1、2、4、8
    2. 留下数字是 1 的那些位,去掉是 0 的那些:剩下 8、2、1
    3. 4 那一位上是 0,什么也不贡献,所以不出现在加法里
    4. 把它们加起来:8 + 2 + 1 = 11

    默认算例,也是能看见缺席那一项的一次:1011 的四位上是 0,所以加法读作 8 + 2 + 1 而不是 8 + 4 + 2 + 1。把这几个数字当十进制数字读会得到一千零一十一,那是这个换算最常见的一种错法。

  2. 读一个整字节,10110010

    1. 八个数字,位值从 128 一路排到 1
    2. 置位的是 128、32、16、2
    3. 加起来:128 + 32 = 160,加 16 是 176,再加 2 是 178
    4. 一个字节能装的最大值是 11111111,也就是 255

    值得走一遍,是因为实际遇到的二进制值几乎都是八位宽,而记住最左边那位是一百二十八、最右边那位是一,一个字节就能一眼读出来。同样这八个数字从另一头读起结果差得很远,所以方向不是细节。

  3. 前导零不改变值

    1. 左起四个零分别坐在 128、64、32、16 这四位上
    2. 零坐在哪里都什么也不贡献,所以这几位整个从加法里消失
    3. 剩下的是同样的 8 + 2 + 1,结果还是 11

    把一个值补齐到固定宽度是常事——宽度有意义时,一个字节写作 00001011 而不是 1011——所以换算器必须两种写法都收、给出同一个答案。页面确实如此,它印出的加法也逐字相同,因为前导零从来没进过那个加法。

  4. 读一个负值,-1011

    1. 负号不是二进制数的一部分,它是数前面的一个符号
    2. 照常读数字:1011 是 8 + 2 + 1 = 11
    3. 把符号放回去,值是 -11

    负号被留在数字外面,而不是折进数字里,因为这里没有固定宽度可以折。处理器把 -11 存进八个位会写成 11110101,那完全是另一串数字,而且取决于宽度是八这件事。本页没有宽度,所以负号就是一个符号。

局限

本页只读整数形式的二进制数。没有二进制小数点,所以 1.01 不会被接受、也无法换算——小数的读法需要另一条关于小数点位置在哪里的规则,而那条规则得按输入逐个说明,没法默认。输入最长五十三个二进制位,也就是十进制的 9007199254740991;更长的值机器存不精确,会被拒绝而不是四舍五入。前导零会被接受并忽略,所以 00001011 与 1011 是同一个数,印出的加法也完全相同。前面带负号会被接受,并带到两个输出上。本页做的是二进制到十进制的换算;反方向是下面链接的另一页,十六进制的读数在再下一页。它不做运算,也不做位运算——没有与、或、异或,也没有移位。

常见问题

怎么手算二进制转十进制?
把位值写在数字下面,从右边的 1 开始,每往左挪一位翻一倍——1、2、4、8、16 这样排下去。然后留下坐在 1 下面的那些值,丢掉坐在 0 下面的,把剩下的加起来。1011 留下的就是 8、2、1,加起来是 11。两种常见的错法是从左边开始读,以及把坐着 0 的位值也加了进去——这两样都能在这一页印出的加法里看出来,因为它只列真正算数的那些项。
为什么答案里没有那些写着 0 的位值?
因为它们什么也不贡献,写出来反而会把要紧的部分埋掉。零乘任何位值都是零,所以像 0×4 这样的项可以直接去掉,不影响总和。写成 8 + 2 + 1 而不是 8 + 0 + 2 + 1,正是为了让缺席的那个四看得见:哪些位置没有东西,是核对数字有没有对齐的办法。
前导零会改变这个数吗?
不会。前导零坐在什么也不贡献的位置上,和十进制里的 007 还是七是一个道理。00001011 与 1011 是同一个数,本页对两者给出完全相同的两个输出。当宽度本身有意义时——比如一个字节通常八位都要写出来——补齐是常事,所以接受带前导零的写法是必要的,不是顺手给的方便。
这里能换算的最大的二进制数是多少?
五十三个二进制位,换成十进制是 9007199254740991。这条线不是本页自己定的:它是机器没法再区分相邻整数的宽度,再长的输入读不精确,页面就只能印出一个看着像答案、其实不是答案的东西。更长的输入会带着说明被拒绝。这一条在这一页比在运算页更要紧,因为换算听起来像读,而读听起来像没有上限。
这和不断除以二是一回事吗?
答案一样,路子不同。反复除以二得到的是从右往左的各位数字,那是反方向——从十进制去二进制——该用的办法。从二进制去十进制,把位值加起来更短,因为数字已经知道了,只要把它们的权重加起来。两种都对;本页印的是加法,因为它是一眼能核对的那一种。
带小数的二进制数能换算吗?
这里不行。本页只读整数,所以二进制小数点会被拒绝而不是被猜。二进制里的小数本身是完全定义好的——小数点右边那些位分别值二分之一、四分之一、八分之一——但接受它们的页面得先决定显示几位、最后一位怎么舍入,而这一组页面一律只处理整数。把这条界线在每一页都划在同一个地方,同一个输入就不会在一页上被接受、在另一页上被拒绝。

参考资料

相关计算器