python反码

任务描述
背景
  原码的优点是容易理解、便于转换,缺点是符号位不能参与加法运算。例如,真实值 −1 和 +1 相加结果是 0,若用 4 位原码进行运算,过程如下:

−1 和 +1 对应的原码分别是 1001 和 0001;
1001+0001=1010;
1010 对应的真实值是 −10,计算结果错误。
  所以,如果原码的符号位参与运算,则会得到错误结果,如果不参与运算,则要对符号位进行额外处理,这会增加硬件实现的复杂程度,降低计算速度。而加法运算是计算机最为核心的一个功能,其速度在很大程度上决定了整个计算机的性能。因此,计算机底层并不使用原码,而是使用补码,在原码和补码之间,还有一个过渡性的编码,称为“反码”。
  真实值对应的反码计算过程如下:

真实值为正时,反码等于原码,如 +1001 的 8 位反码是 00001001;
真实值为负时,先求原码,保持原码符号位不变,将数字部分按位取反(1 变 0、0 变 1),即得反码,如 −1001 的 8 位原码是 10001001,而它的 8 位反码是 11110110。
  如果你不太熟悉该过程,可以参照上面的例题尝试以下计算:
  在这里插入图片描述
  任务
  本关任务是实现ZhenToFan(z)函数,其功能是将给定的真实值z转换成 8 位反码,参数和返回值要求与上关相同,即:
  1)参数z是长度不超过 8 的字符串,表示的是一个二进制整数;
  2)z对应的真实值的符号可能是+或-,也可能没有,如没有,表示是正数,如’-1001’、’+101’、'101’都是z可能的取值;
  3)函数的返回值是字符串类型,表示真实值z对应的 8 位反码。

相关知识
  提示:ZhenToFan函数参考流程图见下。
  在这里插入图片描述
可以看到,该过程主要涉及两个操作:求原码和数字部分按位取反,可以先将这两个操作封装成两个函数(求原码的函数就是上关的ZhenToYuan函数),然后在ZhenToFan函数中调用这两个函数,从而降低实现难度。这其实就是以前多次提到的“将复杂问题分解成一系列的简单问题”。

编程要求
  在 Begin-End 区间实现ZhenToFan(z)函数,具体要求见上。

测试说明
  例如,测试集 1 的输入为:

-1001
  测试集 1 的输出为:

-1001 -> 11110110
开始你的任务吧,祝你成功!

N = 8             #位数为8
########## Begin ##########
def ZhenToYuan(z):
    if z[0] == '-':
        b = '1'
        z = z[1:]
    elif z[0] == '+':
        b = '0'
        z = z[1:]
    else:
        b = '0'
    zl = [i for i in z]
    if len(z)<(N-1):
        for i in range((N-1) - len(z)):
            zl.insert(0,'0')
    zl.insert(0,b)
    y = ''.join(zl)
    return y

def qufan(y):
    yl = [i for i in y]
    for i in range(1,len(yl)):
        if yl[i] == '1':
            yl[i] = '0'
        else:
            yl[i] = '1'
    return ''.join(yl)

def ZhenToFan(z):
    y = ZhenToYuan(z)
    if y[0] == '0':
        f = y
    else:
        f = qufan(y)
    return f
########## End ##########
z = input()       #真实值
f = ZhenToFan(z)  #转换成8位反码
print('%s -> %s' % (z, f))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值