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