快速求补码和原码

本文介绍了一种快速计算补码的方法,通过观察原码和补码中特定位置的数字变化,提供了一种比传统逐位取反再加一更简便的计算方式。这种方法尤其适用于长数字串,避免了复杂的进位计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

朴素方法:

对原码按位变反(求到反码),末位加1.

例:

原码: 1000101010

求得反码: 0111010101

反码末位加1:0111010110

但是遇到比较长的数,这样的求法会很繁琐,有时加1后甚至会有进位。

 

简单方法:

对原码从右往左数,知道遇到第一个数字1,1及1右边的数不变,1左边的数字按位求反。

补码: 0010101000111010
原码: 1101010111000110

仔细看看原码和补码最右边的第一个1的左边是不是都是相反的。

同理,这个方法也可以由补码求原码。

感觉自己动手试试!!

 

附上python验证代码:


#求反码
def Getadverse(trueform):
    ad=list(trueform)
    a=""
    for i in range(len(ad)):
        if ad[i]=='0':
            ad[i]='1'
        else:
            ad[i]='0'
    a="".join(ad)
    return a

#由原码求反码
def Convert(form):
    ad=list(form)
    a=""
    l=len(ad)-1
    flag=False
    for i in range(len(ad)):
        if ad[l-i]=='1' and flag==False:
            flag=True
            continue
        if flag==True:
            if ad[l-i]=='0':
                ad[l-i]='1'
            else:
                ad[l-i]='0'
    a="".join(ad)
    return a
            
def main():
    
    truform=input("put string: ")
    print('反码:',Getadverse(truform))
    print('补码:',Convert(truform))
    print('求得原码:',Convert(Convert(truform)))
    print('真正原码:',truform)
    
main()

 

### 补码转换为原码方法 对于负数而言,可以通过两种方法补码还原为其对应的原码: #### 方法一:逆向操作法 此方法基于补码原码的逆过程来完成转换。具体步骤如下: - **减去1**:从给定的补码数值中减去1。 - **按位取反**:对上述结果中的每一位进行取反操作(符号位除外)。 最终可获得该数的原码。 例如,假设有一个负数的补码 `1111 1000`: - 减去1后变为 `1111 0111`[^1]; - 对其除符号位外的部分逐位取反,从而得出 `1000 1000`作为原码。 #### 方法二:直接处理法 另一种方式涉及先执行按位取反再加1的操作序列: - **按位取反**:针对输入补码里的每位数字实施反转动作(同样不改变符号位)。 - **加上1**:接着把上一步骤的结果增加1单位。 仍以前述例子说明,当面对同样的补码形式 `1111 1000`时, - 首先是对其非符号部分做一次全面翻转得到 `1000 0111`[^2]; - 接着在此基础上累加1, 结果呈现为初始状态下的原码表现形态即 `1000 1000`. 这两种途径均能有效达成由补码返回至相应原码的目标,在实际应用过程中可根据个人习惯或者特定场景需选取合适的方式加以运用。 ```python def complement_to_original(complement): if complement[0] == '0': # 正数情况无需特别处理 return complement inverted_bits = ''.join(['1' if bit=='0' else '0' for bit in complement[1:]]) # 按位取反 (排除符号位) decimal_value = int(inverted_bits, 2) + 1 # 加1恢复原始绝对值大小 binary_representation = bin(decimal_value)[2:].zfill(len(inverted_bits)) # 转回二进制并补齐长度 original_code = '1'+binary_representation # 添加负号标志形成完整的原码表达式 return original_code print(complement_to_original('11111000')) # 输出应为 '10001000' ```
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值