二进制计算器
输入两个二进制数,即可得到和、差、积或商——并逐列展示进位、借位、部分积和长除法的步骤。切换到位运算模式,可在 4 至 128 位下进行 AND、OR、XOR、NOT、移位和循环移位。免费,无需注册,所有内容都留在您的浏览器中。
只能输入二进制数字,可带前导负号。空格和下划线会被忽略,因此 1011 0110 也可以。
结果
1 0010
二进制
18
十进制
12
十六进制
22
八进制
5 位
长度
计算过程
| 行 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|
| 输入进位 | 1 | 1 | 0 | 1 | 0 |
| A | 0 | 1 | 1 | 0 | 1 |
| B | 0 | 0 | 1 | 0 | 1 |
| 和 | 1 | 0 | 0 | 1 | 0 |
如何使用二进制计算器
- 1. 选择运算类型。 算术用于加、减、乘或除。位运算则作用于定宽位模式中的各个位。
- 2. 输入数字。 只使用 0 和 1。允许前导负号、
0b前缀、空格和下划线,因此1011 0110会被读作一个数。 - 3. 选择位宽(仅位运算)。 NOT、移位和循环移位离开位宽便没有意义,因此计算器需要您选择:4、8、16、32、64 或 128 位。
- 4. 阅读结果和计算过程。 答案会以二进制、十进制、十六进制和八进制显示,其下方是逐列的计算过程。
二进制加法如何工作
二进制加法遵循与十进制加法相同的逐列规则,但每一列在 2 处就会溢出,而不是 10。将某一列的两个位与从右侧进来的进位相加。若总和为 0 或 1,直接写下。若为 2 或 3,则写下其低位(0 或 1),并将 1 进到下一列。
| 列和 | 写下的位 | 向左进位 |
|---|---|---|
| 0 + 0 + 0 = 0 | 0 | 0 |
| 1 + 0 + 0 = 1 | 1 | 0 |
| 1 + 1 + 0 = 10 (2) | 0 | 1 |
| 1 + 1 + 1 = 11 (3) | 1 | 1 |
以 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 的约定。
选定位宽下的位运算
| A | B | AND | OR | XOR | NAND | NOR | XNOR |
|---|---|---|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 |
| 0 | 1 | 0 | 1 | 1 | 1 | 0 | 0 |
| 1 | 0 | 0 | 1 | 1 | 1 | 0 | 0 |
| 1 | 1 | 1 | 1 | 0 | 0 | 0 | 1 |
在 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 位。