这不仅仅是领先地位。这是关于所有的位。
从加法开始
首先让我们看看如何在 4 位二进制中对 2 + 7 进行加法:
10 +
111
____
1001
和十进制长加法一样:一点一点,从右到左。
- 在最右边的地方,我们将 0 和 1 相加,得到 1,没有进位。
- 在右数第二位,我们将 1 和 1 相加,即十进制的 2 或二进制的 10 - 我们写 0,携带 1。
- 在右数第三位,我们将携带的 1 与已经存在的 1 相加,得到二进制 10。我们写入 0,携带 1。
- 刚拿到的 1 写在右数第四位。
长减法
现在我们知道二进制 10 + 111 = 1001,我们应该能够倒推并证明 1001 - 10 = 111。同样,这与十进制长减法完全相同。
1001 -
10
____
111
这是我们所做的,再次从右到左工作:
- 在最右边的地方,1 - 0 = 1,我们把它写下来。
- 其次,我们有 0 - 1,所以我们需要多借一点。我们现在做二进制 10 - 1,剩下 1。我们把它写下来。
- 第三,记住我们借了一个额外的位 - 所以我们又得到了 0 - 1。我们使用相同的技巧来借一个额外的位,得到 10 - 1 = 1,我们把它放在结果的第三位。
- 第四,我们又要处理一个借来的问题。从已经存在的 1 中减去借来的位:1 - 1 = 0。我们可以将其写在结果前面,但由于这是减法的结束,因此没有必要。
有一个小于零的数字?!
你还记得你是如何学习负数的吗?部分想法是,您可以从任何其他数字中减去任何数字,仍然可以得到一个数字。所以 7 - 5 是 2;6 - 5 为 1;5 - 5 为 0;什么是4-5?好吧,推理这些数字的一种方法是简单地应用与上述相同的方法进行减法。
例如,让我们尝试二进制的 2 - 7:
10 -
111
_______
...1011
我以与以前相同的方式开始:
- 在最右边的地方,从 0 中减去 1,这需要借位。10 - 1 = 1,所以结果的最后一位是 1。
- 在最右边的第二个位置,我们有 1 - 1 和一个额外的借位,所以我们必须减去另一个 1。这意味着我们需要借自己的位,得到 11 - 1 - 1 = 1。我们在第二个最右边的位置。
- 排在第三位,上面的数字没有更多的位了!但是我们知道我们可以假装前面有一个 0,就像我们会在底部的数字用完比特时做的那样。所以我们有 0 - 1 - 1 因为从第二位借位。我们得再借一点!无论如何,我们有 10 - 1 - 1 = 0,我们将其写在右数第三位。
现在发生了一件非常有趣的事情——减法的两个操作数都没有数字了,但我们还有一个借位需要处理!哦,好吧,让我们继续我们一直在做的事情。我们有 0 - 0,因为这里顶部或底部操作数都没有任何位,但由于借位,它实际上是 0 - 1。
(我们又要借了!再这样借下去,很快就要宣布破产了。)
无论如何,我们借位,我们得到 10 - 1 = 1,我们写在右数第四位。
现在任何一个有半点想法的人都会看到,我们将继续借用钻头,直到奶牛回家,因为没有更多的钻头可以四处走动了!如果你忘了的话,我们在两个地方之前用完了它们。但如果你试图继续前进,它看起来像这样:
...00000010
...00000111
___________
...11111011
- 在第五位我们得到 0 - 0 - 1,我们借位得到 10 - 0 - 1 = 1。
- 在第六位,我们得到 0 - 0 - 1,我们借位得到 10 - 0 - 1 = 1。
- 在第七位我们得到 0 - 0 - 1,我们借位得到 10 - 0 - 1 = 1。
......所以它继续在你喜欢的许多地方。 顺便说一句,我们刚刚导出了 -5 的二进制补码形式。
您可以对您喜欢的任何一对数字尝试此操作,并生成任何负数的二进制补码形式。如果您尝试执行 0 - 1,您会明白为什么 -1 表示为...11111111
. 您还将意识到为什么所有二进制补码负数的最高有效位都为 1(原始问题中的“前导位”)。
实际上,您的计算机并没有无限多的位来存储负数,因此它通常会在某个更合理的数字之后停止,例如 32。我们如何处理位置 33 中的额外借位?呃,我们只是默默地忽略它,希望没有人注意到。当有人注意到我们的新数字系统不起作用时,我们称之为整数溢出。
最后的笔记
当然,这不是使我们的数字系统工作的唯一方法。毕竟,如果我欠你 5 美元,我不会说你目前与我的余额是 ...999999995 美元。
但是我们刚刚推导出的系统有一些很酷的东西,比如减法可以在这个系统中给出正确的结果,即使你忽略了其中一个数字是负数的事实。通常情况下,我们必须考虑条件步骤的减法:要计算 2 - 7,我们首先必须弄清楚 2 小于 7,因此我们计算 7 - 2 = 5,然后在前面加上一个减号得到 2 - 7 = -5。但是对于二进制补码,我们只是继续做减法,而不关心哪个数字更大,正确的结果会自己出来。其他人提到加法很好用,乘法也很好用。