文章目录
- 题目描述
- 输入
- 输出
- 样例输入 Copy
- 样例输出 Copy
- 代码
- 测试
题目描述
在计算机中,对于定点数有三种不同的表示方法。在本题中,假定码的长度固定为 8 位,从左往右依次编号为第 1 到 8 位,第 1 位为最高位。
x 的原码:最高位为符号位,正数符号位为 0,负数符号位为 1,第 2 到 7 位为 x 的二进制表示。
正负 0 的原码不同。
x 的反码:原码符号位除外,其他位按位取反,即 1 变 0, 0 变 1。
x 的补码:正数的补码等于原码,负数的补码等于反码 +1,因此正负 0 的补码相同。
给定整数 x,请给出它的原码、反码和补码。
输入
第一行包含一个正整数 ,表示测试数据的组数。
每组测试数据包含一行,首先是一个符号 “+” 或 “-”,表示 x 的正负,然后是一个非负整数
,表示 x 的绝对值为 y。
输出
对于每组数据,输出三行,第一行为原码,第二行为反码,第三行为补码。
样例输入 Copy
4
+0
+1
-0
-3
样例输出 Copy
00000000
01111111
00000000
00000001
01111110
00000001
10000000
11111111
00000000
10000011
11111100
11111101
代码
def jingzhi(s):#不满足八位就补0
if len(s) < 7:
return '0' * (7 - len(s)) + s
return s
def fanma(s, p):#求反码
st = ''
for t in s:
st += str(p[t])
return st
def buma(s):#求补码
st = list(s[1:7] + str(int(int(s[7]) + 1)))#满2就进1
if st[6] == '2':
for i in range(len(st) - 1, 0, -1):
if st[i] == '2':
st[i - 1] = str(int(st[i - 1]) + 1)
st[i] = '0'
if st[0]=='2':
st[0] = '0'
return st
p = dict()#‘+’为正用0,‘-’为负用1
p['+'] = 0
p['-'] = 1
p['0'] = 1
p['1'] = 0
t = int(input())
for i in range(t):
m = input()
shuzi = int(m[1:])#数字
flag = int(p[m[0]])#符号位
ji = jingzhi(str(bin(shuzi)[2:]))#bin用于求2进制
shuzi1 = str(flag) + ji # 原码
print(shuzi1)
# 反码
fa = str(flag) + fanma(ji, p)
print(fa)
if fa=='11111111' or fa=='01111111':#+0和-0的补码比较特殊,单独处理
print('00000000')
else:
# 正数补码
if flag == 0:
print(shuzi1)
else:#负数补码
b = buma(fa)
st = ''
for t in b:
st += t
print('1' + st)
测试
用于学习记录,大佬有更好的解法,欢迎指教,谢谢。