
2.2.1 进制表示

进制是一种计数方式。它决定了数字的书写方式及进位方式。由于计算机和人类在计数方式上存在很大差异,所以Java语言支持多种进制的表达形式。下面将依次讲解这些进制。
1.二进制
二进制是计算机默认的计数方式。计算机处理的数据都会转化为二进制。为了方便程序员处理底层相关的一些数据,Java语言支持二进制整数的表示方法。在Java语言中,每个二进制数都由0B/0b开始,后面的每位为0或1。形式如图2.2所示。

图2.2 二进制的构成形式
助记:0B/0b中的B/b是二进制的英文单词Binary/binary的首字母,其发音为['baɪnəri]。
【示例2-1】下面将在代码中使用二进制。代码如下:

运行结果如下:

注意:二进制的书写方式只在Java 7及其之后的版本中支持。
2.八进制
在测量长度时,人们常使用单位米。如果要测量一个城市到另一个城市之间的距离,使用米这个单位来计算就太小了,此时就需要使用千米进行计算。对于二进制也一样,当值太大的时候,用二进制表示的话,数值位数就太多了。这时,就需要使用八进制。八进制是将3位二进制合并转化为1位。在Java语言中,每个八进制数都由0开始,后面的每位为0~7。构成形式如图2.3所示。

图2.3 八进制的构成形式
【示例2-2】下面将在代码中表示一个八进制数010。代码如下:

运行结果如下:

注意:%o是printf的格式符,用来显示八进制数。
助记:o是八进制的英文单词octal的首字母,其发音为['ɒktl]。
注意:如果想为八进制数输出前缀,可在%后面添加#标记,如以下代码:

运行结果如下:

米和千米之间可以进行相互转化。在计算机中也不例外,八进制和二进制也可以进行相互转化。下面将依次讲解两者的转化方式。
(1)八进制转化为二进制:转化规则是将八进制的1位转化为二进制的3位,运算顺序是从低位向高位依次进行。以八进制数57为例,具体转化方式如图2.4所示。

图2.4 八进制向二进制转化
(2)二进制转化为八进制:转化规则是将每3位二进制转化为1位八进制,运算顺序是从低位向高位依次进行。以二进制数101111为例,具体转化方式如图2.5所示。

图2.5 二进制向八进制转化
注意:不是所有的二进制数的位数都是3的倍数。如果遇到这种情况,需要使用0进行补充。以二进制数1111为例,转化方式如图2.6所示。

图2.6 二进制向八进制转化(补0)
助记:为了快速进行二进制和八进制之间的转化,需要熟记如表2.2所示的转化关系。
表2.2 二进制和八进制之间的转化关系

3.十六进制
当要计算地球到太阳之间的距离时,使用千米这样的单位就有点小了,此时需要使用到光年。在计算机中也一样,在处理更大的数据时,八进制也会显得有点小。这时就需要使用十六进制。十六进制是将4位二进制合并为1位。在Java语言中,每个十六进制数都由0X/0x开始,后面的每位为0~9或A~F。构成形式如图2.7所示。

图2.7 十六进制的构成形式
助记:0X/0x中的X/x是十六进制的英文单词hexadecimal的第三个字符,其发音为[ˌheksəˈdesɪml]。
【示例2-3】下面将在代码中书写十六进制数0xA。代码如下:

运行结果如下:

注意:%x是printf的格式符,用来显示十六进制数值。
注意:如果想为十六进制数输出前缀,可在%后面添加#标记。
八进制和二进制可以相互转化,十六进制与二进制也不例外。下面将讲解十六进制和二进制之间的转化。
(1)十六进制转化为二进制:转化规则是将十六进制的1位转化成二进制的4位,运算顺序是从低位向高位依次进行。以十六进制数F3为例,具体转化方式如图2.8所示。

图2.8 十六进制向二进制转化
(2)二进制转化为十六进制:转化规则是将二进制的4位转化成十六进制的1位,运算顺序是从低位向高位依次进行。以二进制数11110011为例,具体转化方式如图2.9所示。

图2.9 二进制向十六进制转化
注意:类似于二进制转化为八进制,并不是所有的二进制数的位数都是4的倍数。如果遇到这种情况,也需要使用0进行补充。以二进制数1110011为例,转化方式如图2.10所示。

图2.10 二进制向十六进制转化(补0)
助记:为了快速进行二进制和十六进制之间的转化,需要熟记如表2.3所示的转化关系。
表2.3 二进制和十六进制之间的转化关系

4.十进制
前面讲解的二进制、八进制及十六进制都是贴近于计算机处理的进制类型。对人类来说,十进制才是最容易使用的形式。Java语言也支持十进制的表示方式。在Java语言中,每个十进制整数都由0~9构成。由于八进制整数由0开始,所以十进制整数不能由0开始。
【示例2-4】下面将在代码中展示一个十进制数13。代码如下:

运行结果如下:

注意:%d是printf的格式符,用来显示十进制数值。
助记:d是十进制的英文单词decimal的首字母,其发音为[ˈdesɪml]。
助记:为了快速进行二进制和十进制之间的转化,需要熟记如表2.4所示的转化关系。
表2.4 二进制和十进制之间的转化关系

5.书写方式
在阅读位数过多的数字时,为了方便阅读,可以使用特殊符号将其分隔。例如,书写电话号码时会使用空格分隔,如139****5613。这种方式对于计算机中的进制也不例外。当进制位数太多时,为了方便读取,使用_将其分隔,如0b1010_0101_1011。