很好的解释了x-1为什么以二进制形式“看起来”它的方式

问题描述

让我们用二进制数字28

0b11100     # 28

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

0b11011     # 27

我将如何解释它的“外观”是从数字中减去1时,最右边的1位设置为零,而其后的所有零都设置为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是一个数字

我们记下不带b的二进制数(因为我们知道它始终为2)并且不带n指数,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时,将其从1移到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为底),最上面的数字小于最下面的数字,因此我们不得不借用,但是我们发现下一个列没有任何内容,依此类推,因此我们必须进行计算,直到我们可以借用某些东西为止,该值比它所在的列大一个基数,因此,如果您从数百列借入到10列的tens列中,那么:

所以先借:

  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,嗯,实际上有效。

所以10100-1 = 99,9100-1 = 88,8(八进制)100-1 = 77,7100-1 = 66,依此类推。