“没有什么比有效编码更好的了,阿米戈!相信一个老机器人。”
“你是说间谍使用的密码吗?”
“当然不是。我说的是以易于理解的形式呈现信息。关于数字系统。你知道在日常生活中大多数人都使用十进制系统。它使用 10 个符号来表示每个数字:0、1、2、 3、4、5、6、7、8、9,有10个数位,故称十进制。
“这对十根手指的人类来说很方便。但程序员是伟大的发明家。他们立即想出了使用不同位数的编码。例如,2、8、16 或 64 位数字。他们这样做是为了方便依赖‘有信号/无信号’的计算机。”
“啊,我明白他们的共同点了……所有这些系统都是基于二的幂。
八进制编码
“很好的观察。让我们从涉及 8 位数字的编码开始。人类可能会发现这是最简单的:只需删除数字 8 和 9 并且 - 砰 - 你有八进制编码(数字系统)。你最近被告知文字,对吧?”
“是的,我是。”
“好吧,惊喜!你可以设置使用八进制系统编码的数字文字。当然,如果你真的需要的话。这比听起来容易。只需在整数前面加上 0 即可。
“所以如果数字文字以零开头,是否意味着它是八进制的?”
“是的,Java 会将其视为八进制。
例子:
代码 | 笔记 |
---|---|
|
x 为 13:1*8+5 |
|
x 为 21:2*8+5 |
|
x 为 83:1*64+2*8+3 == 1*8 2 +2*8 1 +3*8 0 |
|
这不会编译:8 不是八进制编码中使用的符号之一。 |
“你不太可能需要在你的代码中写八进制数,但你应该知道它们是什么。”毕竟,你将不得不阅读别人写的代码。如上所述,程序员是大发明家。
好吧,请记住,你不能在每个数字前都写上 0。”
“但如果我打算让它是八进制的,那么我可以吗?”
“是的。
二进制编码
“即使你还不明白,二进制编码是你的母语。让我提醒你一下。如果八进制只有数字 0-7,那么二进制只有 0 和 1。”
“为什么需要这种编码?”
“正如我上面提到的,这与计算机的内部结构息息相关。计算机中的一切都靠电力运行,而碰巧的是,使用电力存储和传输某些东西的最有效方式是使用两种状态:要么电线中没有电(零)并且有电(一)。”
“所以才会这么受欢迎……嗯,看来我确实开始记住这门语言了!”
“所有的机器人都非常理解它。虽然它在 Java 中并不经常使用。Java被认为是一种高级语言,完全从它运行的硬件中抽象出来。事实上,你真的关心用什么格式来存储和处理数据在电脑里面?
“但在过去的几十年里,程序员开始喜欢二进制编码(以及基于它的其他编码)。因此,Java 具有将二进制数作为输入的运算符。浮点数的准确性取决于它们的二进制数表示。
“总之,这种编码你知道总比不知道好。”
“是的。就像八进制编码一样,Java 有一种使用二进制系统对文字进行编码的方法。”
“所以他们只会由0和1组成?”
“完全正确。为了让Java 编译器理解代码包含以二进制编码的数字文字,而不是简单的由 0 和 1 组成的十进制数字,习惯上所有二进制文字都以前缀 0b(' b ' 来自二进制一词)。
例子:
代码 | 笔记 |
---|---|
|
х为4:1*4+0*2+0 |
|
х为15:1*8+1*4+1*2+1 |
|
х为967:1*2 9 +1*2 8 +1*2 7 +1*2 6 +0*2 5 +0*2 4 +0*2 3 +1 *2 2 + 1*2+1; |
|
这不会编译:2 不是二进制编码中使用的符号之一。 |
十六进制编码
“二的四次方是多少?”
“十六岁,你问对了一个机器人的问题是对的!”
“看来你已经很远了,反正十六进制。除了八进制和二进制编码,字面量也可以写成十六进制,这是一种很流行的编码方式。”
“那是因为尽管二进制表示法尽可能接近数字的实际存储方式,但人类很难有效地处理这些数字:在二进制中,100 万是 20 位数字,而不是 7。
“这就是程序员想出十六进制系统的原因。毕竟,正如您正确指出的那样,16 是 2 的 4 次方,因此正好 4 位对应于一个十六进制数字。
“所以现在每 4 位都可以写成一个十六进制数字。”
“对。十六进制编码也有自己唯一的前缀:0x。例子:
十进制数 | 二进制符号 | 十六进制表示法 |
---|---|---|
17 | 0b 0001 0001 | 0x 1 1 |
4 1 | 0b 0010 1 00 1 | 0x 2 9 |
85 | 0b 0101 0101 | 0x 5 5 |
256 | 0b 1 0000 0000 | 0x 1 0 0 |
“好的,所以很清楚我们是如何得到八进制系统的:我们只是丢掉了数字 8 和 9。但是我们从哪里得到十六进制系统的 6 个缺失数字?我想看看它们!”
” 都是直截了当的,取英文字母的前6个字母作为6个缺失数字:A(10)、B(11)、C(12)、D(13)、E(14)、F(15) .
例子:
十六进制表示法 | 二进制符号 | 十进制数 |
---|---|---|
0x 1 | 0b 0000 0001 | 1个 |
0x 9 | 0b 0000 1001 | 9 |
0xA _ | 0b 0000 1010 | 10 |
0xb _ | 0b 0000 1011 | 11 |
0x C | 0b 0000 1100 | 12 |
0xD _ | 0b 0000 1101 | 13 |
0xE _ | 0b 0000 1110 | 14 |
0xF _ | 0b 0000 1111 | 15 |
0x 1F _ | 0b 0001 1111 | 31 |
0x A F | 0b 1010 1111 | 175 |
0x F F | 0b 1111 1111 | 255 |
0x F F F | 0b 1111 1111 1111 | 4095 |
“如何将十六进制数转换为十进制数?”
“这很简单。假设你有数字0 x A F C F。十进制是多少?首先,我们有一个位置数字系统,这意味着每个数字对总数的贡献增加了一个因子16 当我们从右向左移动时:
A * 16 3 + F * 16 2 + C * 16 1 + F
符号 A 对应数字 10,字母 C 表示我们有数字 12,字母 F 表示十五。我们得到:
10 * 16 3 + 15 * 16 2 + 12 * 16 1 + 15
将 16 乘以对应于数字的各种幂,我们得到:
10 * 4096 + 15 * 256 + 12 * 16 + 15
我们总结一切并得到:
45007
“现在你知道 45007 是如何存储在内存中的了吧。”
“是的,我知道。它是0x A F C F ”
“现在让我们把它转换成二进制。在二进制中它将是:
0b 1010 1111 1100 1111
“每组四位正好对应一个十六进制字符。这非常方便。没有任何乘法或幂运算。”
GO TO FULL VERSION