1.八进制编码

说到编码...如您所知,在日常生活中我们使用十进制表示法:我们所有的数字都使用 10 个符号表示:0、1、2、3、4、5、6、7、8、9。共有 10数词,故称十进制。

但程序员是伟大的发明家。他们立即想出了使用不同数量符号的编码。例如,16、8 和 2。

使用 8 个符号的替代编码是最简单的:只需删除 8 和 9 即可获得八进制编码(八进制数字系统)。

而且,是的,您可以使用八进制系统来指定数字文字。如果,当然,你真的需要。这比听起来容易。您只需要在数字前写上数字 0 即可。

换句话说,Java 将任何以 0 开头的整数文字视为八进制值。

例子:

代码 笔记
int x = 015; 
x 为 13:1*8+5
int x = 025; 
x 为 21:2*8+5
int x = 0123; 
x 为 83:1*64+2*8+3 == 1*8 2 +2*8 1 +3*8 0
int x = 078;
这不会编译:8 不是八进制编码中使用的符号之一。

您不太可能需要在代码中编写八进制数,但您应该知道它们是什么。毕竟,您将不得不阅读其他人编写的代码。如上所述,程序员是大发明家。

好吧,请记住,您不能简单地在每个数字前写上 0。



2.二进制编码

二进制编码更有趣。如果八进制只有数字 0-7,那么二进制只有 0 和 1。为什么需要这种编码?

这与计算机的内部结构息息相关。计算机中的一切都靠电力运行,碰巧的是,使用电力存储和传输某些东西的最有效方法是使用两种状态:电线中没有电(零)和有电(一)。

这就是二进制数字系统流行的由来。

原则上,它在 Java 中并不经常使用:Java 被认为是一种高级语言,完全从其运行的硬件中抽象出来。事实上,您真的关心计算机内部使用什么格式存储和处理数据吗?

但在过去的几十年里,程序员开始喜欢上二进制编码(以及其他基于它的编码)。因此,Java 具有将二进制数作为输入的运算符。浮点数的准确性取决于它们的二进制表示。

基本上,了解这种编码总比不知道好。

与八进制编码的情况一样,Java 有一种使用二进制系统对文字进行编码的方法。也就是说,文字仅由 0 和 1 组成。为了让Java 编译器理解代码包含以二进制编码的数字文字,而不是简单的由 0 和 1 组成的十进制数,所有二进制文字都使用前缀0b标识('b' 来自单词 binary) .

例子:

代码 笔记
int x = 0b100; 
х为4:1*4+0*2+0
int x = 0b1111; 
х为15:1*8+1*4+1*2+1
int x = 0b1111000111; 
х为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;
int x = 0b12000;
这不会编译:2 不是二进制编码中使用的符号之一。


3.十六进制编码

除了八进制和二进制编码,字面量也可以写成十六进制。这是一种非常流行的编码。

这是因为尽管二进制表示法尽可能接近数字的实际存储方式,但人类很难有效地处理这些数字:在二进制中,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
0x 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


4.如何将数字从十六进制转换

将数字从十六进制转换为十进制非常容易。假设您有数字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

你知道这个数字是如何存储在内存中的:

0x A F C F

但是现在让我们把它转换成二进制。在二进制中它将是:

0b 1010 1111 1100 1111

每组四位正好对应一个十六进制字符。那是超级方便。没有任何乘法或取幂。”