跳到主要内容
CalcMax

二进制计算器

结果

10001

二进制

十进制
17
十六进制
11
余数
0

二进制计算器把两个二进制数做加减乘除,答案同时用二进制、十进制与十六进制三种写法给出。二进制的数位只有 0 和 1,运算规则与十进制完全一样,唯一不同的是在哪一位上进位:十进制里 9 加 1 要进位,因为底是十;二进制里 1 加 1 就要进位,因为底是二。这一条就是二进制加法的全部,减法、乘法、除法都从它推出来。同一个答案写三遍,是因为三种读法各有各的用处:二进制是你输入的那个东西,十进制是最容易一眼复核的,而十六进制是同样这些位按每四位一组重新写出来的样子——写机器码的人平时看的就是它。除法是整除,除不尽时余数单独占一行,不会化成小数点后面的数字。

公式

1011 + 110 = 10001 (11 + 6 = 17)

1011
第一个数,用二进制写。把它按二进制读才是十一;同样这几个数字按十进制读是一千零一十一,这正是本页要防的那个错
+ − × ÷
运算符。逐位进行,与十进制笔算一样,只是每一位上那条够不够进位的线从十挪到了二
1 + 1 = 10
二进制算术里唯一一条不眼熟的事实:两个 1 写 0 并向高位进 1,因为这一位只有 0 和 1 两个数字,写不下二。三个 1 得 11——本位写 1、再进 1
各位数字 × 2ⁿ
十进制读数是怎么来的:每一位乘上它的位值再全部相加。10001 就是这样得出一十七的,这也是二进制与十进制之间唯一的通道
余数
除不尽时剩下的部分。1011 除以 10 得 101 余 1,因为十一是五个二再加一。余数恒占一行,加减乘三种运算不会有余数,那一行读作 0
53 位
本页接受的输入上限:最大 9007199254740991,写成二进制是一后面跟五十三个数字。再宽的话机器就没法把相邻的整数区分开,算术会悄悄地不再精确

凡是需要读写二进制的地方,这一页的作用与十进制计算器一样:规则不难,难的是笔算又慢又看不出错在哪。日常的用法集中在读硬件寄存器与位掩码——某个状态字节里哪几位被置上了、某个开关量在什么条件下翻转、子网掩码怎么划——以及核对编译器、调试器或网络工具打印出来的二进制值。文件权限位、CPU 状态寄存器的标志列、单片机的引脚状态,都是人们真的要在上面做四则运算的二进制数,而答案旁边的十六进制读数正是这些值被写进文档时的样子。另一种用法是学:进位规则是每个人在纸上都会错一次的那一步,输 1011 加 110 看见 10001 出来,比在书上看一遍例题更快。课上做进制练习的学生,以及要把一段机器码的清单换算回可核对数值的人,都会发现十进制与十六进制两个读数替他们干了大部分活。

算例

  1. 1011 加 110

    1. 两个数右端对齐:1011 与 0110
    2. 最右一位:1 + 0 = 1
    3. 下一位:1 + 1 = 10,本位写 0、进 1
    4. 再下一位:0 + 1 再加进上来的 1 得 10,本位写 0、再进 1
    5. 最高一位:1 加进上来的 1 得 10,本位写 0、向新的一位进 1
    6. 结果读作 10001,也就是十进制的一十七

    本页的开场算例,也是看进位规则最快的一次:和比两个加数都长,因为最后一次进位需要新的一位来放。十进制的 17 就是复核——十一加六确实是一十七;十六进制的 11 是同样这些位按四位一组切出来的,它碰巧长得像十进制的十一,数一大这个巧合就没了。

  2. 1011 除以 10

    1. 这是十一除以二,所以答案是五余一
    2. 五写成二进制是 101,一就是 1
    3. 页面把商报成 101、余数报成 1,而不是印一个 101.1

    这一条说明余数那一行为什么必须存在。只给商的话,101 会让人读成十一除以二等于五,而下面那一行才让这句话成立。不化成小数还有第二个理由:结果一旦有小数部分,运算就可能除不尽——二进制里的三分之一是无限循环的——而本页从输入到输出都是整数。

  3. 110 减 1011

    1. 这是六减十一,结果是负的
    2. 差是五,符号写在结果前面
    3. 五写成 101,所以答案是 -101

    这里没有用到补码——那是处理器在定宽存储负数时用的表示法。负号被保留成数前面的一个符号,这既是人在纸上写的写法,也是这个值印在十进制与十六进制读数旁边时仍然读得通的写法。同样一个值在机器里会是一段固定宽度的 0 和 1,而宽度这件事本页没有。

局限

本页只处理整数。没有二进制小数点,也不收小数形式的二进制,所以 1.01 会被拒绝——这也意味着除不尽时给出的是商加余数,而不是小数展开,并且商是向零截断而不是四舍五入。输入上限是 9007199254740991,也就是一后面五十三个二进制位;超过这个宽度,运算无法再保证精确,超长的输入会被拒绝而不是给你一个近似答案。结果同样受这个上限约束,乘出来越界的会报错而不会印一个错的数。负数写成前面带负号,不用补码,也不提供也不假定任何固定位宽:本页的 1011 就是四位,不是某个寄存器的低四位。除以零会被拒绝。

常见问题

为什么 1 加 1 等于 10,而不是 2?
因为二进制里没有表示二的数字。数位只有 0 和 1,写到 1 这一位就到头了,正好像十进制里个位写到 9 就到头一样。所以两个 1 在这一位写 0,并向高位进 1,写作 10——这跟十进制的 9 + 1 = 10 是同一句话,只是底从十换成了二。三个 1 得 11:本位一个 1、再往上进一个 1。
做加法或乘法时,为什么结果里还有一行余数?
因为结果面板是一组固定的行,而不是会随运算增减的列表,而一个时有时无的行比一个位置固定的行更难读。整数范围内加减乘都不会有余数,所以那几行读作 0——那个 0 是「这次运算没有剩下东西」这句实话,不是没算出来。真正会有余数的是除法,那一行存在的意义是不让一个截断过的商看起来像一个精确答案。
最多能输入多大的数?
9007199254740991,也就是五十三个 1,写成十六进制是 1FFFFFFFFFFFFF。这个上限来自机器能精确表示的位数:再宽下去,相邻的两个整数就没法区分了,运算会悄悄地不再精确——结果看起来像个数,其实不是。超长的输入会带着说明被拒绝,而不是被截断或四舍五入;乘出来越过同一条线的结果也是如此。
能不能做减法,得到负的结果?
可以。把较大的数放在第二个框里,答案就会带着负号回来,三种读法都带。这用的不是补码——处理器把负数存成定宽的一串位时用的是补码——而是数前面加符号的写法,也就是你在纸上会写的那种,并且在十进制与十六进制读数旁边仍然读得通。本页不假定任何位宽,所以负的结果不会被绕成一串 1。
为什么除法不精确?
因为本页只处理整数,除不尽时给的是向零截断的商加上余数。十一除以二等于五余一,页面报的是 101 和 1,而不是 101.1。这是有意的取舍而不是缺口:结果一旦带小数部分,运算就可能除不尽——二进制里的三分之一是无限循环的——而一个悄悄四舍五入的页面会印出一个并不是答案的数。
旁边的十六进制读数有什么用?
它是同一个值按每四位一组重新写出来的样子,也就是写机器码的人读二进制的方式。一个字节是八位,因此正好是两个十六进制位,所以文档、调试器和数据手册里出现的是 FF、2A、B2 这样的写法。二进制与十六进制之间的换算其实不叫计算,只是重新分组,所以这个读数是白送的。

参考资料

相关计算器