0%

“取反加一”等价于“减一取反”的证明

在补码运算中,经常需要进行“取反加一”操作。本文尝试证明“减一取反”操作与“取反加一”操作等价。

一、设定

假如一个补码数有“1+x”位,第1位为符号位,后面x位为有效数据位。“取反加一”或者“减一取反”操作在有效数据位上进行。

二、证明

证明可分为两种情况。

2.1、从右往左数,遇到的第一个“1”所在位为第k位,且k<=x

可以将有效数据位分为两部分:[x…k+1]和[k…1],前半部分A可以表示成“xxxx…xxx”的形式,后半部分B可以表示成“1000…000”的形式。
对有效数据位分别进行“取反加一”操作和“减一取反”操作。

  • “取反加一”操作结果为:
    前半部分A转换成“~A”
    后半部分B转换成“B”(“取反”得到“0111…111”,“加一”得到“1000…000”)
  • “减一取反”操作结果为:
    前半部分A转换成“~A”
    后半部分B转换成“B”(“减一”得到“0111…111”,“取反”得到“1000…000”)

以上证明两种操作等价。

2.2、从右往左数,从第1位到第x位都为“0”,不存在“1”位

可以将有效数据位表示成“0000…000”的形式。
对有效数据位分别进行“取反加一”操作和“减一取反”操作。

  • “取反加一”操作结果为:
    “0000…000”(“取反”得到“1111…111”,“加一”得到“0000…000”)
  • “减一取反”操作结果为:
    “0000…000”(“减一”得到“1111…111”,“取反”得到“0000…000”)

以上证明两种操作等价。


综合2.1和2.2,可以证明“取反加一”操作和“减一取反”操作等价。
您的支持将鼓励我继续分享!