文章目录
- Introduction
- Inspiration
- Why base systems
- Binary & Hex
- Counting in binary
- Additional resources
Introduction
笔记作者 tips:这一节是关于进制的讲解,推荐观看原视频或学会二进制的读者跳过这一篇!
本节课将介绍基本的计算机系统,在计算机中数字可能通过这几种进制进行显示:
- 二进制 Binary 0101 1010 1001 0011 1001 1100 1111 1100
- 十进制 Decimal 1,519,623,420
- 十六进制 Hex 5A939CFC
上节课我们见到二进制,现在我们要真正理解二进制和十六进制,学习 game hacking 几乎无法避免学习这样的数字进制系统。如果你要学习机器学习,你需要学习微积分、物理、统计学等等,但我们实际上要容易很多,我们只是再次学习如何计数
Inspiration
The papuan language Bukiyip… has tow different counting systems, one base-4 and another base-3. According to Bukiyip custom, which system you use depends on what objects you are counting.
上面的大致意思是:古代巴布亚新几内亚人的计数方式,会根据不同的计数对象,应用不同的计数方法,就是说,古代人可以熟练使用不同的进制方式,那么作为21世纪的程序工作者也当然可以学会二进制、十六进制
通常我们在十六进制数前面加上 0x,也就是 0x10 实际上等于十进制数字 16
同理,0b10 是二进制数,等于实际上的十进制数 2
当你看到数字 0x10 时,不要相信自己的眼睛,他不是实际上的数字 10 而是 16
Why base systems
为什么要学习二进制和十六进制?
- Humans had a few systems in use throughout history – base 10 won
- Computers need to store information as off/on or 0/1
人类使用十进制,而计算机使用二进制,学习二进制的重要性不言而喻。十六进制呢?因为十六进制和二进制之间有一些巧妙的联系,可以方便人类理解和管理二进制技术系统,以及一些历史原因。
为了学习二进制和十六进制,我们要忘记十进制,这是最难的,因为大多数人一生都盯着十进制数字,让我们注意一下如何数数:
- 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
- 当数到 10,我们就会回收数字,把10进位,然后再开始 0, 1, 2…
- 也就是 10, 11, 12…
如果我们发明一个计数系统,给10一个符号,比如A是10,B是11等等,比如:
- 8, 9, A, B, C…
- 显然我们不可能给每个数字都发明一个符号,因为数字是无限的
- 在十六进制中最大到符号 F,那么 0xF => 15,0x1F => 31
此时你应该可以理解:
- 十进制数字 4294967295
- 等于二进制数字 11111111111111111111111111111111
- 等于十六进制数 FFFFFFFF
Binary & Hex
我们尝试把二进制数字以4个一组分割开:
- F F F F 每个符号对应下面的4个一组
- 1111 1111 1111 1111
如果我们修改其中的一组:
- F A F F
- 1111 1010 1111 1111
那么就会有一个 F 变成 A,十六进制数和4个二进制数之间有很强的相关性。人类无法很好地读取二进制数,而二进制数也不能很好的转换成十进制数,但二进制转换成十六进制是简单的,只需要分成 4个一组的块 即可。
Counting in binary
让我们学习如何用二进制计数:
- 十进制数 999,如果加上1,会从最后一位开始进位,最终变成 1000
- 对于二进制数字 01111,也是一样的,开始进位会变成 10000
你可以尝试使用二进制来从 0 数到 15,这样可以很快理解二进制
这里原视频的讲解配合动画,推荐查看原视频
你可以打开计算器,选择程序员模式,来查看这些变化,选择 HEX 输入十六进制,选择 BIN 输入二进制:
Additional resources
在上一节中我们知道,计算机里面以八个位 bit 为一组形成一个字节 byte
现在你应该可以理解在计算机内部:
01101000 01100001 01110100
这些二进制数字排布,对应的十六进制和十进制状态了,接下来我们用十六进制代替他们:
01 00 00 01 FF F0 F0 02 80 41 FF B0
日后我们将使用十六进制来看,不太可能用二进制了,除了一些典型的例外
- 01 00 00 00 使用了 4 byte = 32 bit
- 74 69 使用了 2 byte = 16 bit