【问题标题】:Two's complement proof补码证明
【发布时间】:2010-10-19 17:24:31
【问题描述】:

是否有可能通过归纳证明,对于所有长度为 n 的序列,任何 0 字符串的二进制补码总是会得到 0?

我正在尝试使用价值公式来做到这一点,即

值 = -a_n-1 x 2^(n-1) + summation{i=0 to n} (a_i x 2^i),其中 n = 字符串中的位数

【问题讨论】:

  • 属于 mathoverflow/math.SE 吗?
  • 你可能混淆了一个补码和二进制补码。
  • Pet peeve: [ Ones' 补充](en.wikipedia.org/wiki/Ones'_complement) (对一个评论和一个答案,在更多人得到一个答案之前)胡思乱想的一面;)
  • 确实属于MO。可以想象在 M.SE 上,如果你知道,它是正确的。但是二的补码几乎完全是一个计算概念,所以在这里看起来并不过分。

标签: math proof twos-complement


【解决方案1】:

111..111的2补码不就是1(也就是说111..111代表-1)吗?

【讨论】:

    【解决方案2】:

    您是否要证明,例如,1111 1111 的二进制补码是0000 0000?如果是这样,您无法证明它,因为它是错误的。 1111 1111 的二进制补码是 0000 0001

        1111 1111
    ->  0000 0000 <- one's complement
    ->  0000 0001 <- add 1
    

    回复您的编辑:当然。但是你不需要感应。将0_n 的所有位取反以获得一个补码,得到1_n 并添加1 将所有位翻转回零(1 + 1 = 10 和进位位渗透到我们丢弃它的位置)。 QED。

    【讨论】:

    • 对不起,是 0 的字符串。例如,0000 => 翻转位并加 1 将产生 1111 + 1 = 0000,其中 1 进位被丢弃。
    【解决方案3】:

    1) X的两个补码的定义:翻转X的位并求和1

    2) 两个1位变量的二进制和(http://www.play-hookey.com/digital/adder.html)(b1是第一个变量,b2是第二个变量。b1:X表示位X在变量中)

    r1 = b1:1 XOR b2:1
    carry = b1:1 AND b2:1
    

    2.1) 如果两个位都是一个 b1:1 和 b2:1

    r1 = 0  (always)
    carry = 1 (always)
    

    3) 两个2位变量的二进制和

    r1 = b1:1 XOR b2:1 
    carry1 = b1:1 AND b2:1
    
    r2 = (b1:2 XOR b2:2) XOR carry:1
    carry2 = (b1:2 AND b2:2) OR (b1:2 AND carry:1) OR (b2:2 AND carry:1)
    

    3.1) 从 2.1 我们可以减少

    carry2 = (b1:2 AND b2:2) OR (b1:2 AND 1) OR (b2:2 AND 1)
    carry2 = b1:2 OR b2:2
    

    4) 是一个数字,全零。翻转所有位将生成一个全为数:Ones

    5) 位 0 异或任何东西 = 任何东西(异或的真值表)

    6) 将 (1) 应用于数字零

    6.1) 翻转

     Flipping Zero = Ones
    

    6.2) 总和 1

     result = Ones + N_One (N_One = 00...001)
     result:1 = 0 (from 2.1)
     carry:1 = 1 (from 2.1)
    

    6.3) 由于 N_One 中除 N_One:1 之外的所有位均为零。

     result:n = (Ones:n XOR N_One:n) XOR carry:(n-1) (from 3)
     result:n = (Ones:n XOR 0) XOR carry:(n-1) (definition of N_One 6.2)
     result:n = Ones:n XOR carry:(n-1)
    

    6.4) 从 3.1

    carry:n = Ones:n OR N_One:n -> if carry:n-1 is 1
    carry:n = 1 OR 0            -> if carry:n-1 is 1
    carry:n = 1                 -> if carry:n-1 is 1
    

    由于第一个进位 (carry:1) 在 6.1 中定义为 1,所有进位都定义为 1

    7) 来自 6.3 和 6.4

     result:n = Ones:n XOR carry:(n-1)
     result:n = 1 XOR 1
     result:n = 0
    

    对于任何 n 值,证明 (~n+1) 始终为 0。(对于具有固定位域大小的机器,最后一个进位总是被忽略)

    QED

    【讨论】:

      猜你喜欢
      • 2020-05-31
      • 1970-01-01
      • 2021-01-25
      • 1970-01-01
      • 2012-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多