作者:手机用户2502935633 | 来源:互联网 | 2023-09-24 10:09
题目描述题目链接:https:nanti.jisuanke.comtT1182蒜头君有一个int的整数,输出它的32位二进制补码。输入格式一个整型整数。输出格式输出一行,即该整数的
题目描述
题目链接:https://nanti.jisuanke.com/t/T1182
蒜头君有一个 int 的整数,输出它的 32 位二进制补码。
输入格式
一个整型整数。
输出格式
输出一行,即该整数的补码表示。
输出时每行末尾的多余空格,不影响答案正确性
样例输入
7
样例输出
00000000000000000000000000000111
解题思路
首先弄清楚原码、反码、补码的概念:
以8位二进制码为例:
原码:
9的二进制:0000 1001
-9的二进制:1000 1001
反码:
正数反码即本身
负数反码将除了最高位的符号位不变以外,其余位数全部取反
+9 为 0000 1001
-9 为 1111 0110
补码:
正数的补码即本身
负数的补码在反码的基础上+1、
+9 为 0000 1001
-9 为 1111 0111
本题目有两个坑点:
1、对于python来讲,int型的负数采用bin函数以后,得出的并非真正的二进制负数,而是该负数对应正数的前面加了个负号,如下所示:
num1=9
num1_b=bin(num1)
num2=-9
num2_b=bin(num2)
print(num1_b)
print(num2_b)
#输出:
0b1001
-0b1001
2、虽然python自带取反码操作,但是并非我们想象中的直接按照位数取反
如上图所示,3取反为-4,-4取反为3,python的取反操作实际是对原数+1再取相反数。原理如下:
1.对3取反:(取4位二进制)
①化为二进制:
3→0011
②对二进制结果取反:
0011→1100
③对结果先取反再加1:
1100→(~1100+1)→0011+1→0100
④对符号取反并化为十进制:
-0100→-4
2.对-4取反:
①化为二进制:
4→0100
②对二进制结果取反:
0100→1011
③对结果先加1再取反:
1011→~(1011+1)→ ~1100→0011
④对符号取反并化为十进制:
+0011→3
因此,对于本题目,要首先解决这两个大坑:
对于第一个大坑,直接采用分治法,分三种情况进行计算
对于第二个大坑,采用手动取反的方式,即list(map(lambda x: (int(x) + 1) % 2, b))
最后注意一下细节,比如32位要都有且符合格式,还有边界情况,就ok啦~
python代码
n=int(input())
if n >0:
b=bin(n)[2:]
list_b = [0] * (32 - len(b))
list_b=list_b+list(map(int,b))
str_b="".join('%d'%i for i in list_b)
print(str_b)
elif n<0:
b=bin(n)[3:]
list_b=[1]*(32-len(b))
list_b=list_b+list(map(lambda x: (int(x) + 1) % 2, b))
str_b = "".join('%d' % i for i in list_b)
int_b=int(str_b,base=2)+1
ans=bin(int_b)[2:]
print(ans)
else:
print("0"*32)