很好地解释了为什么 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 等等。
让我们取二进制数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 等等。