一个补码中{2}的幂的总和

时间:2016-02-03 21:27:16

标签: binary integer signed twos-complement ones-complement

每个人都听过这个joke by Bill Gosper

  

任何给定的编程语言与机器无关的神话是   通过计算2的幂的总和容易爆炸。

     
      
  • 如果结果使用符号+循环周期= 1,则表示您处于符号级别的计算机上。
  •   
  • 如果结果以-1 = -1循环,则表示您使用的是二进制补码机。
  •   
  • 如果结果以句点>循环1,包括开头,你是一台补充机器。
  •   
  • 如果结果以句点>循环1,不包括开头,你的机器不是二进制 - 模式应该告诉你基础。
  •   
  • 如果内存不足,则使用字符串或Bignum系统。
  •   
  • 如果算术溢出是一个致命的错误,一些只读头脑的法西斯猪试图强制机器独立。但非常   陷阱溢出的能力取决于机器。
  •   
     

通过这种策略,考虑宇宙,或者更确切地说,代数:

     

让X =两个幂的总和= ... 111111

     

现在将X添加到自身;

     

X + X = ... 111110

     因此,2X = X-1,因此X = -1

     

因此代数在机器上运行(宇宙)   这是两个补充。

我想我理解其他部分,但我坚持一个人的补充部分。我将考虑一个3位加一个符号位的简单示例。

bignum和非二元架构的行为很明确。

  

如果结果使用符号+循环使用句点= 1,则表示您使用sign-magnitude计算机。

当两个幂溢出到符号位时,它变为负零,因此添加它不会改变任何东西。下一次迭代,它完全失败了,我们一遍又一遍地添加正零,保持在MAXINT

示例:

 ______________________________
|  Power of 2  ||  Accumulator |
| |   ||Decimal|| |   ||Decimal|
|0|001||    +1 ||0|001||    +1 |
|0|010||    +2 ||0|011||    +3 |
|0|100||    +4 ||0|111||    +7 |
|1|000||    -0 ||0|111||    +7 |
|0|000||    +0 ||0|111||    +7 |
|0|000||    +0 ||0|111||    +7 |
 ...

这确实是一个周期为1且为正值的循环。

  

如果结果以-1 = 1循环,则表示您使用twos-complement机器。

当2的幂溢出到符号位时,它产生最低的可表示整数。将其添加到

示例:

 ______________________________
|  Power of 2  ||  Accumulator |
| |   ||Decimal|| |   ||Decimal|
|0|001||    +1 ||0|001||    +1 |
|0|010||    +2 ||0|011||    +3 |
|0|100||    +4 ||0|111||    +7 |
|1|000||    -8 ||1|111||    -1 |
|0|000||    +0 ||1|111||    -1 |
|0|000||    +0 ||1|111||    -1 |
 ...

果然,它在-1处循环。

  

如果结果以句点>循环1,包括开头,你在ones-complement机器上。

那是,我无法弄明白。我希望它应该去:

 ______________________________
|  Power of 2  ||  Accumulator |
| |   ||Decimal|| |   ||Decimal|
|0|001||    +1 ||0|001||    +1 |
|0|010||    +2 ||0|011||    +3 |
|0|100||    +4 ||0|111||    +7 |
|1|000||    -7 ||1|111||    -0 |
|0|000||    +0 ||1|111||    -0 |
|0|000||    +0 ||1|111||    -0 |
 ...

我特别看不到它如何以大于1的周期循环。这意味着2的幂不是简单地通过左移(否则单个1位最终下降)产生的,但那么它们是怎样的呢?计算

1 个答案:

答案 0 :(得分:2)

实现产生这两种权力的能力。也取决于机器。你假设左移。对于最后两台机器,另一种方式不同,即将当前机器添加到自身。

补充8 + 8 = 1 :(或等效地,-7 + -7)

   1000
 + 1000
-------
 1 0000
      1
-------
   0001