跳转到正文

二进制计算器

输入两个二进制数,即可得到和、差、积或商——并逐列展示进位、借位、部分积和长除法的步骤。切换到位运算模式,可在 4 至 128 位下进行 AND、OR、XOR、NOT、移位和循环移位。免费,无需注册,所有内容都留在您的浏览器中。

运算类型

只能输入二进制数字,可带前导负号。空格和下划线会被忽略,因此 1011 0110 也可以。

结果

1 0010

二进制

18

十进制

12

十六进制

22

八进制

5 位

长度

计算过程

带进位的逐列加法
行43210
输入进位11010
A01101
B00101
和10010

如何使用二进制计算器

  1. 1. 选择运算类型。 算术用于加、减、乘或除。位运算则作用于定宽位模式中的各个位。
  2. 2. 输入数字。 只使用 0 和 1。允许前导负号、0b 前缀、空格和下划线,因此 1011 0110 会被读作一个数。
  3. 3. 选择位宽(仅位运算)。 NOT、移位和循环移位离开位宽便没有意义,因此计算器需要您选择:4、8、16、32、64 或 128 位。
  4. 4. 阅读结果和计算过程。 答案会以二进制、十进制、十六进制和八进制显示,其下方是逐列的计算过程。

二进制加法如何工作

二进制加法遵循与十进制加法相同的逐列规则,但每一列在 2 处就会溢出,而不是 10。将某一列的两个位与从右侧进来的进位相加。若总和为 0 或 1,直接写下。若为 2 或 3,则写下其低位(0 或 1),并将 1 进到下一列。

单列的四种情况
列和写下的位向左进位
0 + 0 + 0 = 000
1 + 0 + 0 = 110
1 + 1 + 0 = 10 (2)01
1 + 1 + 1 = 11 (3)11

以 1101(13)加上 101(5)为例。计算器会把两者都补齐到五列,并显示每一列接收到的进位——从左到右为 11010——结果是 10010,即 18。进位那一行正是人们手算时最容易遗漏的部分。

减法、乘法与除法

减法的思路相反:当某一列需要计算 1 − 1 − 1 或 0 − 1 时,它会从左侧一列借 1,而该位在此处的价值为 2。1000 − 0011 显示一次借位贯穿三列,结果为 0101(8 − 3 = 5)。当 A 小于 B 时,计算器用较大的数减去较小的数,并给结果加上负号。

乘法是移位相加。乘数中的每个 1 都贡献一份被乘数,并按该位的位置左移;0 则不贡献任何东西。以 1011 × 101(11 × 5)为例,1 位于第 0 位和第 2 位,因此部分积为 1011 与 101100,两者之和为 110111,即 55。

除法是长除法,其中的猜测步骤非常简单。每次带下被除数的一位;若除数能放入当前的部分,则相减并在商中写 1,否则写 0。1100100 ÷ 111(100 ÷ 7)得到商 1110(14)和余数 10(2)。若操作数为负,商向零截断,余数的符号与 A 相同——这是 C、Java 和 JavaScript 的约定。

选定位宽下的位运算

双输入位运算
ABANDORXORNANDNORXNOR
00000111
01011100
10011100
11110001

在 4 位下,1100 与 1010 的 AND 为 1000,OR 为 1110,XOR 为 0110。NOT 会翻转位宽之内的每一位,因此同样的 1100 在 4 位下变为 0011,而在 8 位下则为 11110011——这正是位宽重要的原因。

左移 n 位会把每一位向上移动 n 个位置,并以零填充;移出顶端的位会丢失,计算器会将其列出。逻辑右移以零填充。算术右移则复制最高位,因此负数保持为负:10110110 右移 2 位,逻辑上得到 00101101,算术上则得到 11101101(−19)。循环移位会把从一端移出的位绕回到另一端,因此不会丢失任何位。

算术模式中没有溢出

这里的算术在任意长度下都是精确的,因此 11111111 + 1 得到 100000000,而不是 0。真实硬件会保留固定的位数并发生回绕。要查看这种行为以及与之相关的有符号范围,请使用补码计算器。

常见错误

  • 忘记最左一列的进位。 两个 8 位数相加可能得到 9 位的结果。计算器会保留多出的那一列。
  • 混淆逻辑右移与算术右移。 对正数二者结果相同,而对最高位为 1 的任何模式则结果不同。各语言的做法也不同:Java 的 >> 是算术移位,>>> 是逻辑移位;而 C 语言中对负的有符号值使用 >> 由编译器决定(主流编译器为算术移位)。
  • 不经意地把位模式当作有符号数。 11110011 作为无符号数是 243,按补码则是 −13。位运算结果会同时显示两者,方便您判断自己所指的是哪一个。
  • 以为 NOT 与位宽无关。 在无界整数中,12 的 NOT 是 −13。在固定位宽内,它则是补码模式,这正是本计算器返回的结果。

常见问题

如何做二进制加法?
从最右一列向左逐列进行,把两个位与任何进位相加。列和为 0 或 1 时直接写下;为 2 时写 0 并进位 1;为 3 时写 1 并进位 1。例如 1101 + 101 = 10010。计算器会显示进入每一列的进位。
如何做二进制减法?
从右向左逐列相减。若某一列会低于零,则向左一列借 1,这会使当前列加上 2。若第二个数更大,则改用另一个顺序相减,并在结果前加上负号。1000 − 11 = 101(8 − 3 = 5)。
逻辑右移与算术右移有何区别?
逻辑右移用零填充空出的最高位,因此把该模式视为无符号数。算术右移则复制原来的最高位,因此负的补码数保持为负。两者都会使数值减半,但只有算术移位能正确处理负值。
AND、OR 和 XOR 各做什么?
它们逐列比较两个位模式。AND 只在两位都为 1 时得 1,OR 在至少一位为 1 时得 1,XOR 在恰好一位为 1 时得 1。AND 用于屏蔽位,OR 用于置位,XOR 用于翻转位或比较差异。
此计算器能处理负的二进制数吗?
算术模式下可以:在数前加上负号,计算器就会对精确结果应用符号规则。位运算模式则接受普通的位模式,因为负数的模式取决于位宽。若要找出负值的模式,请使用补码计算器。
我能输入多大的二进制数?
没有固定上限,因为运算使用任意精度的整数。列计算过程适用于最长 64 位的操作数;超出此范围时您仍能得到精确结果,只是没有步骤表。位运算限于所选位宽,最高 128 位。

相关工具

数据、标记语言与代码中的更多工具