计组:已知原码求补码

原理:

取补码的游戏规则:取反加一

取反之后,若末位为0【即原码末位为1】:

末位0变1,前面所有位保持反码数据状态不变

也就是说,若原码末位为1,执行操作:
末位不变,前面所有位取反 

取反之后,若末位为1【即原码末位为0】:

末位1变0,向前进位

进入循环:

若前一位为0:

0变1,结束循环

若前一位为1,一样的:

1变0,向前进位,继续向前循环

直到出现(找到)“前一位为0”的情况为止


若原码末位为0,执行操作:

一直向前寻找,直到找到最末一位“1”(最末一位“1”代表着:这一位1后面的数字,全都为0)

保持最末一位“1”及其后面的数字不变

解释:

100...000取反加一

=>011...111加一

=>100...000

前面数字全部取反(保持反码的取反状态不变)


综上所述:

收纳上述总结论如下:

Case 1:

若原码末位为1,执行操作:

末位不变,前面所有位取反 

Case 2:

若原码末位为0,执行操作:

一直向前寻找,直到找到最末一位“1”

保持最末一位“1”及其后面的数字不变

前面所有位取反 (保持反码的取反状态不变)

 而实际上,根据我们的想法验证,Case 1即特殊的Case 2的情况,如此而已


最后,还有一点需要注意的是:

无论是我们在使用上述简便办法还是老老实实办法(取反加一)求补码的时候

执行的“取反”的操作针对的对象范围,仅限于(局限于)数值剩余剩下的数值位

不包含符号位!!!!

唯一需要将所有位(包括数值位和符号位)全部都取反的情况为:

将减数转化为加数

即:

已知 [ B ] 的补码,求 [ -B ] 的补码

猜你喜欢

转载自blog.csdn.net/Zz_zzzzzzz__/article/details/131847513