问题描述
让我们用二进制数字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,依此类推。