请求证明整数按位取反公式~n = -(n+1)并提供思路提示
嘿,我明白你卡在这的感觉——一开始确实容易把补码的规则当成“理所当然”的公理,但其实咱们可以用题目给的提示和补码的本质定义一步步推出来,别着急,咱们慢慢来。
首先明确两个核心前提:
- 我们讨论的是k位有符号整数的补码表示:最高位(第k-1位)是符号位,对应的值为$-2{k-1}$,而非无符号数中的$2{k-1}$
- 题目给出的关键求和公式:$\sum_{i=0}^N 2^i = 2^{N+1} - 1$
思路一:从n和~n的和入手(最直观)
按位取反的定义是把n的每一位0变1、1变0,那将n和~n的二进制每一位相加,结果每一位都是1(0+1=1,1+0=1),得到一个全1的k位二进制数。
计算这个全1补码的数值:
最高位贡献$-2{k-1}$,剩下的k-1位的和用求和公式计算为$\sum_{i=0}{k-2}2^i = 2^{(k-2)+1} -1 = 2^{k-1}-1$,所以总和为:
$$-2^{k-1} + (2^{k-1}-1) = -1$$
也就是说:
$$n + \text{~}n = -1$$
把n移到等式右侧直接推导结论:
$$\text{~}n = -1 -n = -(n+1)$$
思路二:严谨的代数推导(基于补码数值定义)
如果需要更细致的推导,咱们从补码的数值定义出发:
假设k位补码中,n的二进制表示为$b_{k-1}b_{k-2}...b_0$,则n的数值为:
$$n = b_{k-1} \times (-2^{k-1}) + \sum_{i=0}^{k-2}b_i \times 2^i$$
按位取反后的$\text{~}n$二进制为$(1-b_{k-1})(1-b_{k-2})...(1-b_0)$,其数值为:
$$\text{~}n = (1-b_{k-1}) \times (-2^{k-1}) + \sum_{i=0}^{k-2}(1-b_i) \times 2^i$$
展开并化简这个式子:
$$
\begin{align*}
\text{~}n &= -2^{k-1} + b_{k-1} \times 2^{k-1} + \sum_{i=0}{k-2}2i - \sum_{i=0}^{k-2}b_i \times 2^i \
&= -2^{k-1} + b_{k-1} \times 2^{k-1} + (2^{k-1}-1) - \left(n + b_{k-1} \times 2^{k-1}\right)
\end{align*}
$$
观察式子可以发现,$b_{k-1} \times 2^{k-1}$与$-b_{k-1} \times 2{k-1}$抵消,$-2{k-1}$与$2^{k-1}$抵消,最终化简为:
$$\text{~}n = -1 -n = -(n+1)$$
结合你提到的补码求负规则
你说的“求负数要取反加1”,本质上就是$-n = \text{~}n + 1$,把这个式子移项后,正好就是$\text{~}n = -n -1 = -(n+1)$——这说明咱们要证明的公式,其实和补码求负的规则是等价的,并非凭空的公理,而是补码表示逻辑下的必然推导结果。
备注:内容来源于stack exchange,提问作者wengen

