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

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

距离蓝桥杯56天


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


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


题目链接


3bdc63d257fa469985fa36b012364b81.png

706466599f614f8ea96bef091c3852b9.png


问题分析:很多小伙伴一定和小郑一样 对 题干说明的:给出字节作为有符号整数的值 不理解在一开始的时候 为什么会有负数?对于和小郑一样的小白来说,一个字节八位,表示的数据范围[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')

由于长度过长,就放一张‘九的’好了,具体可自行运行代码


b6181b6e1a4e44e49b900b36305cf92d.png

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


相关文章
|
存储
蓝桥杯-明码
蓝桥杯-明码
71 0
|
存储
蓝桥杯 真题:明码 一题掌握3种码
蓝桥杯 真题:明码 一题掌握3种码
160 0
蓝桥杯 真题:明码 一题掌握3种码
|
7月前
|
人工智能 算法 Java
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-992 士兵杀敌(二)
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-992 士兵杀敌(二)
89 1
|
7月前
|
人工智能 算法 Java
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1005 数字游戏
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1005 数字游戏
115 0
|
7月前
|
Java C语言 C++
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1000 kAc给糖果你吃
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1000 kAc给糖果你吃
88 0
|
7月前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-999 数的潜能
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-999 数的潜能
92 0
|
7月前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-997 粘木棍
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-997 粘木棍
97 0
|
7月前
|
机器学习/深度学习 算法 Java
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-996 车的放置
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-996 车的放置
96 0
|
7月前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-986 藏匿的刺客
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-986 藏匿的刺客
101 0
|
7月前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-985 幸运的店家
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-985 幸运的店家
88 0