0


二进制补码

二进制补码

  • 查看
  • 提交
  • 统计
  • 提问

总时间限制:

5000ms

单个测试点时间限制:

1000ms

内存限制:

65536kB

描述

有符号的整数在计算机内部用二进制补码表示。

定义**函数 ****to_complement(n, bits)**,对于给定的一个整数 n 和一个正整数 bits,该函数输出整数 n 的 bits 位二进制补码表示。

例如:

to_complement(5,8) 输出 00000101

to_complement(-5,8) 输出 11111011

to_complement(32767,16) 输出 0111111111111111

to_complement(-32767,16) 输出 1000000000000001

to_complement(-1,32) 输出 11111111111111111111111111111111

to_complement(13,3) 输出 13 is out of the range of representation with 3bits!

输入

第一行输入 m,表示接下来会有 m 行
每行输入两个用空格分隔的整数,分别表示 n 和 bits。

输出

m个0、1的序列

样例输入

  1. 2
  2. 5 8
  3. -5 8

样例输出

  1. 00000101
  2. 11111011

提示

1.函数需要对参数情况进行检查;
2.不能使用内置函数 bin 以及字符串的 format 方法。

  1. import math
  2. def to_complement(n, bits):
  3. if n > math.pow(2, bits - 1) - 1 or n < -math.pow(2, bits - 1):
  4. print(str(n) + ' is out of the range of representation with ' + str(bits) + 'bits!')
  5. else:
  6. absn = abs(n)
  7. b = [] # 存储余数
  8. while True: # 一直循环,商为0时利用break退出循环
  9. s = absn // 2 # 商
  10. y = absn % 2 # 余数
  11. b = b + [y] # 每一个余数存储到b中
  12. if s == 0:
  13. break # 余数为0时结束循环
  14. absn = s
  15. b = b + (bits - len(b)) * [0]
  16. if n < 0:
  17. # 求负数补码的技巧,从后往前数,数到第一个数为1后,剩余的都取反
  18. first = False
  19. for i in range(bits):
  20. if b[i] == 1 and not first:
  21. first = True
  22. continue
  23. if first:
  24. if b[i] == 0:
  25. b[i] = 1
  26. else:
  27. b[i] = 0
  28. b.reverse() # 使b中的元素反向排列
  29. b = [str(i) for i in b]
  30. print(''.join(b))
  31. m = int(input())
  32. for i in range(m):
  33. n, bits = map(int, input().strip().split())
  34. to_complement(n, bits)
标签: python 算法

本文转载自: https://blog.csdn.net/Knight_Ren/article/details/121059681
版权归原作者 Knight_Ren 所有, 如有侵权,请联系我们删除。

“二进制补码”的评论:

还没有评论