任务描述
背景
原码的优点是容易理解、便于转换,缺点是符号位不能参与加法运算。例如,真实值 −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))
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)