繁体   English   中英

很好地解释了为什么 x-1 “看起来”像二进制一样

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

让我们以二进制数28为例:

0b11100     # 28

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

0b11011     # 27

我将如何解释它的“外观”是,当从一个数字中减去1时,最右边的 1 位设置为零,并且设置为 1 之后的所有零。 例如:

  0b10101 - 1
= 0b10100

  0b01000 - 1
= 0b00111

  0b10000000 - 1
= 0b01111111

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

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

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

例如你的数字 28 是1 x 2^4 + 1 x 2^3 + 1 x 2^2 + 0 x 2^1 + 0 x 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 可以写成0 x 2^4 + 1 x 2^3 + 0 x 2^2 + 0 x 2^1 + 0 x 2^0 - 1 x 2^0。 在纯十进制中 8 - 1 = 7 和 7 在二进制中是0 x 2^4 + 0 x 2^3 + 1 x 2^2 + 1 x 2^1 + 1 x 2^0 (4 + 2 + 1 )

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

  1000 
- 0001
========

这是基数 10,更容易看到:

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

我们从个列开始(以 0 次方为底数),顶部的数字小于底部的数字,因此我们必须借用,但我们发现下一列没有任何内容等等,因此我们必须继续工作直到我们可以借用一些东西,这个值比它所在的列大,所以如果你从百列借入十位列,那么十位列:

所以先借:

  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

因此,对于减法,您反转/一个对第二个操作数和进位进行补码并将它们馈送到加法器。 一些体系结构反转执行并将其称为借用,有些体系结构只是保持不变。 当这样做时,如我们在上面看到的那样,如果没有借用,则结转为 1。 如果有借款,则为零。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM