任务描述
背景
上关提到,计算机底层一般采用补码表示数值。真实值对应的补码计算过程如下:
真实值为正时,补码等于原码,如 +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))