计蒜客T1182 输出二进制补码(python3.6)

题目描述

题目链接: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自带取反码操作,但是并非我们想象中的直接按照位数取反
《计蒜客T1182 输出二进制补码(python3.6)》
如上图所示,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)

    原文作者:Alwaysion
    原文地址: https://blog.csdn.net/anan15151529/article/details/109510814
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞