距离蓝桥杯56天
学习算法的目的是为了提升自己
感谢某站对三种码的讲解 传送门原码 反码 补码_哔哩哔哩_bilibili
题目链接
问题分析:很多小伙伴一定和小郑一样 对 题干说明的:给出字节作为有符号整数的值 不理解在一开始的时候 为什么会有负数?对于和小郑一样的小白来说,一个字节八位,表示的数据范围[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')
由于长度过长,就放一张‘九的’好了,具体可自行运行代码
我是小郑 正在奔赴热爱 奔赴山海