[英]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 时,你从最右边的位置开始,如果有 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.