第四届全国中医药院校大学生程序设计竞赛 : 二进制码(Python)

题目描述

在计算机中,对于定点数有三种不同的表示方法。在本题中,假定码的长度固定为 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)

测试

在这里插入图片描述
用于学习记录,大佬有更好的解法,欢迎指教,谢谢。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不会敲代码的破茧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值