任务描述
背景
  上关提到,计算机底层一般采用补码表示数值。真实值对应的补码计算过程如下:

真实值为正时,补码等于原码,如 +1001 的 8 位补码是 00001001;
真实值为负时,反码加 1 即得补码,也就是将原码的数字部分按位取反后再加 1,如 −1001 的 8 位原码是 10001001,按位取反是 11110110,再加 1 得补码 11110111。
  如果你不太熟悉该过程,可以参照上面的例题尝试以下计算
  在这里插入图片描述
可以看到,+0 和 −0 的补码相同,都是全 0,而原码和反码没有这一性质。
  此外,上关提到,原码的符号位不能参与加法运算,导致硬件实现时会比较复杂。而在补码中,符号位参与运算。如真实值 −1 和 +1 相加结果是 0,若用 4 位补码进行运算,过程如下:
  在这里插入图片描述
  任务
  本关任务是实现ZhenToBu(z)函数,其功能是将给定的真实值z转换成 8 位补码,参数和返回值要求与上关相同,即:
  1)参数z是长度不超过 8 的字符串,表示的是一个二进制整数;
  2)z对应的真实值的符号可能是+或-,也可能没有,如没有,表示是正数,如’-1001’、’+101’、'101’都是z可能的取值;
  3)函数的返回值是字符串类型,表示真实值z对应的 8 位补码。

相关知识
  提示:ZhenToBu函数参考流程图如下。
在这里插入图片描述
可以看到,该过程主要涉及三个操作:求原码、数字部分按位取反、加 1 运算,可以先将这三个操作封装成三个函数,然后在ZhenToBu函数中调用这些函数,从而降低实现难度。具体来说:

在这里插入图片描述
编程要求
  在 Begin-End 区间实现ZhenToBu(z)函数,具体要求见上。

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

-1001

测试集 1 的输出为:

-1001 -> 11110111

开始你的任务吧,祝你成功!

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 fanmajiayi(f):
    if f in [N*'1']:
        b = N*'0'
    else:
        index = f.rfind('0')
        fl = [i for i in f]
        fl[index] = '1'
        for i in range(len(fl)):
            if i > index:
                fl[i] = '0'
        b = ''.join(fl)
    return b

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

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐