蓝桥杯 真题:明码 一题掌握3种码

距离蓝桥杯56天 

学习算法的目的是为了提升自己 

感谢某站对三种码的讲解 传送门原码 反码 补码_哔哩哔哩_bilibili

 题目链接蓝桥杯 真题:明码 一题掌握3种码_第1张图片

蓝桥杯 真题:明码 一题掌握3种码_第2张图片

 问题分析:很多小伙伴一定和小郑一样 对 题干说明的:给出字节作为有符号整数的值 不理解在一开始的时候 为什么会有负数?对于和小郑一样的小白来说,一个字节八位,表示的数据范围[00000000,11111111]即[0,255] 哪儿来的负数? 

 其实 上面的这种认识是基于无符号数据,实际上,数值数据还有一种叫做有符号数据

有符号数据有三种表示法:原码,反码,补码

只要了解了原码 后面两种码迎刃而解

8位原码 最高位0表示正号,1表示负号 后七位的范围是[0,127]

所以8位原码的范围[-127,127] 所以确定一个数字的原码分两步:1:正负号决定最高位 2:数字的绝对值决定后七位

懂了原码 反码就好理解了:反码基于原码,除了最高位(符号位),其余取反

懂了反码 补码就好理解了:补码基于反码 在反码的基础上+1

而这三种码,补码最重要 因为在计算机系统中,数值一律用补码来表示和存储。

所以下面着重研究算补码的办法(本题也基于补码)

先研究负数:

举个例子:求-1的补码 那么我们已知-1的原码为10000001

那么-1的反码为11111110 那么-1的补码为11111111

就这么简单。然后对于负数[-127,-1]都可以按照上述类似求-1的方法计算

然后对于-128,我们规定它的补码是10000000

再研究正数:

正数的补码=正数的反码=正数的原码    综上8位补码的表示范围[-128,127]

所以,了解了三种码以后(最重要的是补码),回归题目,现在对字节作为有符号整数的值的概念是不是清晰了?实际上就是让我们求每个整数的补码 

每行汉字有32个字节构成,16*16的像素:一行2个字节,一个字节8位,组成16行

因此把它打印出来即可:所以问题在问九的九次方是多少?

s="""4 0 4 0 4 0 4 32 -1 -16 4 32 4 32 4 32 4 32 4 32 8 32 8 32 16 34 16 34 32 30 -64 0 
16 64 16 64 34 68 127 126 66 -124 67 4 66 4 66 -124 126 100 66 36 66 4 66 4 66 4 126 4 66 40 0 16 
4 0 4 0 4 0 4 32 -1 -16 4 32 4 32 4 32 4 32 4 32 8 32 8 32 16 34 16 34 32 30 -64 0 
0 -128 64 -128 48 -128 17 8 1 -4 2 8 8 80 16 64 32 64 -32 64 32 -96 32 -96 33 16 34 8 36 14 40 4 
4 0 3 0 1 0 0 4 -1 -2 4 0 4 16 7 -8 4 16 4 16 4 16 8 16 8 16 16 16 32 -96 64 64 
16 64 20 72 62 -4 73 32 5 16 1 0 63 -8 1 0 -1 -2 0 64 0 80 63 -8 8 64 4 64 1 64 0 -128 
0 16 63 -8 1 0 1 0 1 0 1 4 -1 -2 1 0 1 0 1 0 1 0 1 0 1 0 1 0 5 0 2 0 
2 0 2 0 7 -16 8 32 24 64 37 -128 2 -128 12 -128 113 -4 2 8 12 16 18 32 33 -64 1 0 14 0 112 0 
1 0 1 0 1 0 9 32 9 16 17 12 17 4 33 16 65 16 1 32 1 64 0 -128 1 0 2 0 12 0 112 0 
0 0 0 0 7 -16 24 24 48 12 56 12 0 56 0 -32 0 -64 0 -128 0 0 0 0 1 -128 3 -64 1 -128 0 0"""
a=s.split('\n')

dict={}

def reverse(str):
    ans=''
    for i in str:
        ans+='0' if int(i)==1 else '1'
    return ans

for j in range(-128,128):
    if j>=0:
        dict[j]=(8-len(bin(j)[2:]))*'0'+bin(j)[2:]
    elif j==-128:
        dict[j]='10000000'
    else:
        tmp=reverse((7-len(bin(abs(j))[2:]))*'0'+bin(abs(j))[2:])#除了符号位取反
        tmp_add=bin(int(tmp,2)+1)[2:]#+1
        dict[j]='1'+(7-len(tmp_add))*'0'+tmp_add
    
for i in a:
    tmp=list(map(int,i.split()))
    start=0#end=31
    while start<=30:
        s=dict[tmp[start]]+dict[tmp[start+1]]
        print(s)
        start+=2
    print('\n')
    

由于长度过长,就放一张‘九的’好了,具体可自行运行代码蓝桥杯 真题:明码 一题掌握3种码_第3张图片

                         ​​​​​​​        ​​​​​​​我是小郑 正在奔赴热爱 奔赴山海 

你可能感兴趣的:(蓝桥杯,Python,笔记,蓝桥杯,算法,python)