【飞郁2022新课程】04 - 十六进制
同学同学,你怎么..不开心?
进制太烦了,我算的乱七八糟
来来来,听完我这节课,你还是不说不懂的话,我不保证不打死你???…
拓展内容:十进制转其他进制
十进制数12 如何转成二进制?其实上节课我们已经讲过了,我们来复习一下
我们把数值都放到个位,看看他怎么进位即可
我们12全放在个位是不行的,二进制只有1和0,那么我们需要进位,
所以
12/2 = 6 余0
代表我们有6个2进位到十位,余0代表个位为0,我们暂且可以写成60,当然2进制不能有6,所以我们继续进位
6/2 = 3 余 0
代表我们有3个2进位到百位 ,余0代表十位为0,我们暂且写成300,但是2进制不能有3,所以我们继续进位
3/2 = 1 余 1
代表我们有1个2进位到千位 ,余1代表百位为1,我们可以写成1100,里面已经没有除了1和0之前其他的数值,那么我们得到了最终结果1100
那么,我们来一点有难度的:
十进制123 转成 9进制等于多少? 用同样的方法计算一下
146,怎么样会算吗?
十六进制
计算机底层是2进制,我们常用是10进制,其实我们掌握这两种就够用了,
但是我们这节课来学习一下16进制。
为什么会牵扯出16进制呢?16进制实际上是2进制的简写方式。
为什么要简写呢?
大家试想一下,如果屏幕上面全都是0和1一串数值,让你去看或则记忆,会是一种上面样的情况
例如
11010100100101000101111101001010101
疯掉了吧?
所以我们必须要有一种简写的方式来帮助我们观看
聪明的人类是这样设计的
4位2进制最小是0000,最大是1111,也就是 0 - 15,那么我们就可以用一位的16进制来表示4位的2进制了,16进制的16的符号分别是0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
例如 1101 我直接可以用 0xD 表示了
11011111 就是0xDF 是不是看起来舒服多了,看起来不那么累了
以后我们看到的二进制,无论是VS的反汇编窗口还是IDA,OD,CE等工具里,全部都是以16进制的形式体现出来的
也就是二进制的简写方式
写16进制的时候前面加个0x
例如 0x10
字节与位
我们说4位2进制可以用一位16进制表示
那么8位2进制就是两位16进制表示
8位也是我们编程应用的最小单位,叫做1字节
1字节8位的最大值:
1
1字节8位的最小值:
2
十六进制转换
例:
16进制转10进制 0x4a = ?
答案:74
例:
10进制转16进制 99=? 1277=?
答案:99=0x63
1277=7916+d= d+F16+41616=0x4FD
3
进制符号化_拓展
我们来看下十进制的定义 0123456789 10个符号 逢10进1
注意是说的10个符号,这10个符号可以不是0123456789
如果是)!@#¥%……&*( 这10个符号 你还会计算吗
% + …… = !! 能看出来吗?
打乱这种就可以达到加密的效果
例:
9进制 9个符号分别为543672189 (分别对应012345678 )
现在5已经代表0了…
那么176+829=?
答案:
176 和 829 分别对应 643和 758
643+758= 1512
然后转换回现在的定义 4 2 4 3
4
2.学员问答
3.习题+考核
课上练习题
•说出5种生活中进制使用的实例
•将十进制的256//1024//4095//65,536//1000转换为16进制
•将16进制的0x64//0x3E8//0x2710//0x666转换为10进制
•如果12345678分别代表8进制的01234567,那么243+367=?
•16进制的0xAB+0xCD等于多少?将结果转换为10进制等于多少
•将16进制的0x579B转换为2进制
•将2进制的10110111011110分别转换为16进制和10进制
•将二进制的1011111010010100转化为16进制以及十进制,要求写出过程或原理
•计算0xD0DF1C+0x56789A的值
•将十进制的6666转化为9进制(防止你们用计算器)
•如果! @ # $ % ^ 分别对应6进制的012345计算%$%+@^@
•分别用16进制表示32位游戏和64位游戏的最大内存是多少,他们相差的多么?是二倍关系么?
•想一想生活中特殊进制的实例,以及他们的进位关系
•根据任鸟飞老师的讲解和你们的理解,想一想我们为什么要学习进制,为什么要做进制转换练习
•继续计算!将10进制的123,转化成2进制.想一想有几种算法,他们的特点是什么?
选做题
•10进制下有一个两位数AB,在7进制下恰好为BA。请问满足条件的两位数有几个?
•一个16进制的算式如下LN+LM=NMN,如果LMN各不相同,请问他们分别是那几个数字?
课上练习题答案
•说出5种生活中进制使用的实例
•将十进制的256//1024//4095//65,536//666转换为16进制
•0x100//0x400//0xFFF//0x10000//0x29A
•将16进制的0x64//0x3E8//0x2710//0x666转换为10进制
•100//1000//10000//1638
•如果12345678分别代表8进制的01234567,那么243+367=?
•521
•16进制的0xAB*0xCD等于多少?将结果转换为10进制等于多少
•0x178//376
•将16进制的0x579B转换为2进制
•0101 0111 1001 1011
•讲2进制的10110111011110分别转换为16进制和10进制
•0x2DDE//11742
•将二进制的1011111010010100转化为16进制以及十进制,要求写出过程或原理
1011111010010100按照4位一组进行排列
1011 1110 1001 0100
每4位对应一个16进制的数字,转换之后为
B E 9 4
0xBE94=11161616+141616+916+4=48,788
错误做法,直接将2进制按照常规算法转成10进制,然后再转16进制
这样会麻烦很多,工作量很大
•计算0xD0DF1C+0x56789A的值
16进制计算,逢16进1,直接相加即可
0xD0DF1C+0x56789A = 12757B6
逐位相加
D+5=12(00000)
0+6=6(0000)
D+7=14(000)
F+8=17(00)
1+9=A(0)
C+A=16
16+A0+1700+14000+60000+1200000= 12757B6
不合理做法,先转成10进制,相加之后再转化回来
•将十进制的6666转化为9进制(防止你们用计算器)
做法除以9取余数倒叙排列
6666/9=740……6
740/9=82……2
82/9=9……1
9/9=1……0
1/9=0……1
最终结果为10126
•如果! @ # $ % ^ 分别对应6进制的012345计算%$%+@^@
首先将%$%+@^@转化为012345 然后再进行计算,算完记得转化回来
%$%+@^@=434+151=1025=@!#^
•分别用16进制表示32位游戏和64位游戏的最大内存是多少,他们相差的多么?是二倍关系么?
32位是0-FFFFFFFF
64位是0-FFFFFFFF FFFFFFFF
相差的很多,应该是1 0000 0000倍而不是2倍
•想一想生活中特殊进制的实例,以及他们的进位关系
比如时间进制,秒和分是60进制,小时是24进制,天是30或者31进制,月是12进制
•根据任鸟飞老师的讲解和你们的理解,想一想我们为什么要学习进制,为什么要做进制转换练习
因为16进制是逆向的核心进制,在数据分析的过程中我们需要对16进制和10进制的关系非常敏感.而其他的进制也可能作为加密的数据出现在分析过程中,了解进制转换的过程,并不是说我们每次都要去手动计算,而是为了了解原理,看透本质
•继续计算!将10进制的123,转化成2进制.想一想有几种算法,他们的特点是什么?
两种算法,第一种直接用除以2的方式得出2进制为111 1011
第二种先将10进制转化为16进制0x7B,再将0x7B中的两个数字分别转化为0111和1011,最终结果为1111011
选做题1答案
•步骤1:先思考第一个问题, 7进制下BA在10进制下是多少? 这个问题是最基本的进制换算, 7进制下BA就是7×B+A, 这就是10进制下的值。
•步骤2:再思考第二个问题, A和B需要满足什么条件? 首先判断A和B的范围, A和B一定小于7。 由相等关系有7×B+A=10×A+B, 化简即3×A=2×B。
•步骤3:综合上述几个问题, 考虑原题目的答案。 根据步骤2的结果, B一定是3的整数倍, 结合小于7的条件,B只能取3或6, 此时对应的A是2或4, 所以满足条件的两位数是23或46
选做题2答案
一个16进制的算式如下LN+LM=NMN,如果LMN各不相同,请问他们分别是那几个数字?
答案为L=8
M=0
N=1
也就是0x81+0x80=0x101
原理,N和M相加等于N,说明M为0,并且个位没有进位
L+L=NM,说明进位了,并且十位为0,进位只能是进1,所以N一定为1
L+L=0x10,L必然等于0x8