在补码运算中,经常需要进行“取反加一”操作。本文尝试证明“减一取反”操作与“取反加一”操作等价。
一、设定
假如一个补码数有"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,可以证明“取反加一”操作和“减一取反”操作等价