很好地解释了为什么 x-1 "looks" 是二进制的方式

Good explanation on why x-1 "looks" the way it does in binary

让我们取二进制数28

0b11100     # 28

如果我们从数字中减去 1,它看起来像这样:

0b11011     # 27

我怎么解释呢'looks'就是当一个数减去1时,最右边的1位设置为0,之后的所有0都设置为1。例如:

  0b10101 - 1
= 0b10100

  0b01000 - 1
= 0b00111

  0b10000000 - 1
= 0b01111111

对于为什么会发生这种情况,最好的解释是什么?我确定它是二进制补码的 属性,但我正在尝试找出最好的方式来向自己解释这一点,以便我可以更深入地了解它。

二进制数的一般形式为 N = dn x b^n + dn-1 x b^n-1… d1 x b^1 + d0 x b^0,其中 b 是基数 (2),d 是数字 < 基数 (0, 1),n 是位置。

我们写下没有 b 的二进制数(因为我们知道它总是 2),也没有它的 n 指数,它隐式地从 0 开始最低有效数字(最右边),1 紧挨着最右边,等等。

例如你的数字 28 是 1x 2^4 + 1x 2^3 + 1x 2^2 + 0x 2^1 + 0x 2^0 = 1x 16 + 1x 8 + 1x 4 + 0x 2 + 0x 1 .

二进制:

  • 1 - 1 = 0
  • 0 - 1 = 1 然后将 - 1 进位到左边的下一个位置(与十进制的 10 - 1 相同,0 - 1 是 9 并将 - 1 进位至十分之一)

当你从最右边的位置减去 1 时,如果有 0 你把它变成 1 并且将减法进行到下一个(左边)位置(并且一直向左链接直到你找到可以减去的位置没有影响更高的职位)

0b01000 - 1 可以写成 0x 2^4 + 1x 2^3 + 0 x 2^2 + 0x 2^1 + 0x 2^0 - 1 x 2^0。在普通十进制中是 8 - 1 = 7,二进制中的 7 是 0x 2^4 + 0x 2^3 + 1x 2^2 + 1x 2^1 + 1x 2^0 (4 + 2 + 1 )

无论你在哪个基地,数学都不会改变:

  1000 
- 0001
========

这是以 10 为底,更容易看清:

  1  0  0  0 
- 0  0  0  1
=============

我们从第一个列开始(基数的0次方),上面的数字小于下面的数字所以我们不得不借用,但是我们发现下一列没有任何东西等等所以我们必须重新计算,直到我们可以借到一些东西,该值的基数大于它所在的列,所以如果你从百列借到十列,即 10 个十,那么:

所以先借:

  0 10  0  0 
- 0  0  0  1
=============

第二次借:

  0  9 10  0 
- 0  0  0  1
=============

第三次借:

  0  9  9 10 
- 0  0  0  1
=============

现在我们可以将基础工作到一列的幂:

  0  9  9 10 
- 0  0  0  1
=============
           9

在这种情况下可以轻松完成:

  0  9  9 10 
- 0  0  0  1
=============
  0  9  9  9

所以基数 5:

    1  0  0  0
 -  0  0  0  1
===================

    0  5  0  0
 -  0  0  0  1
===================

    0  4  5  0
 -  0  0  0  1
===================

    0  4  4  5
 -  0  0  0  1
===================


    0  4  4  5
 -  0  0  0  1
===================
    0  4  4  4

和基数 2:

   1  0  0  0
-  0  0  0  0 
==============

   0 10  0  0
-  0  0  0  0 
==============

   0  1 10  0
-  0  0  0  0 
==============

   0  1  1 10
-  0  0  0  0 
==============

   0  1  1 10
-  0  0  0  0 
==============
   0  1  1  1

当你在逻辑上实际实现它时,二进制补码开始发挥作用,我们从初级编程中知道 类 当我们谈论“二进制补码”时,我们学会了“反转并加一”来取反一个数.我们从小学数学中知道 x - y = x + (-y) 所以:

     0
  1000
- 0001
=======

这等同于:

     1 <--- add one
  1000
+ 1110 <--- invert
=======

完成:

 10001
  1000
+ 1110
=======
  0111

所以对于减法,你 invert/ones 补充第二个操作数和进位并将它们提供给加法器。一些架构反转进位并称其为借用,有些则不修改。当我们按照上面看到的那样这样做时,如果没有借位,则进位为 1。如果有借用,则为零。

我认为这是一个基数为 2 的东西,只是因为只有零或一个。如何反转以 10 为基数的数字? 1000 - 1 = 1000 + 9998 + 1,嗯,确实有效。

所以基数 10 100 - 1 = 99,基数 9 100 - 1 = 88,基数 8(八进制)100 - 1 = 77,基数 7 100 - 1 = 66 等等。