Java 进制理解与进制转换详解

1. 引言

在编程中,理解进制系统是非常重要的。计算机底层使用二进制进行数据存储和运算,但我们日常使用的数字是十进制数。因此,在编程过程中,经常需要进行不同进制之间的转换。本文将详细介绍常见的进制系统及其在 Java 中的表示和转换方法。

2. 什么是进制?

进制(Base or Radix)是指一种计数系统中数字符号的总数。最常见的进制系统包括二进制、十进制、八进制和十六进制。

2.1 二进制(Binary,Base-2)

  • 表示方式:使用 01 两个符号。
  • 应用:计算机的底层数据存储和处理。
  • 示例1011(二进制)表示为十进制为 11

2.2 十进制(Decimal,Base-10)

  • 表示方式:使用 09 这十个符号。
  • 应用:日常生活中最常用的进制系统。
  • 示例123(十进制)表示为十进制的 123

2.3 八进制(Octal,Base-8)

  • 表示方式:使用 07 这八个符号。
  • 应用:历史上用于计算机系统,现在较少使用。
  • 示例17(八进制)表示为十进制为 15

2.4 十六进制(Hexadecimal,Base-16)

  • 表示方式:使用 09AF(或 af)这十六个符号,A 表示 10B 表示 11,以此类推,F 表示 15
  • 应用:在计算机科学中广泛使用,特别是在表示内存地址和颜色编码时。
  • 示例1F(十六进制)表示为十进制为 31

3. 不同进制的表示方法

在 Java 中,可以直接使用不同的语法来表示不同进制的数字:

  • 二进制:使用前缀 0b0B 表示。例如,0b1010 表示二进制的 1010
  • 八进制:使用前缀 0 表示。例如,012 表示八进制的 12
  • 十进制:不使用前缀,直接书写。例如,123 表示十进制的 123
  • 十六进制:使用前缀 0x0X 表示。例如,0x1A 表示十六进制的 1A
public class Main {
    public static void main(String[] args) {
        int binary = 0b1010; // 二进制
        int octal = 012;     // 八进制
        int decimal = 123;   // 十进制
        int hex = 0x1A;      // 十六进制
 
        System.out.println("二进制 0b1010 对应的十进制: " + binary);
        System.out.println("八进制 012 对应的十进制: " + octal);
        System.out.println("十进制 123: " + decimal);
        System.out.println("十六进制 0x1A 对应的十进制: " + hex);
    }
}

输出结果

二进制 0b1010 对应的十进制: 10
八进制 012 对应的十进制: 10
十进制 123: 123
十六进制 0x1A 对应的十进制: 26

4. 进制转换

在实际编程中,经常需要进行不同进制之间的转换。Java 提供了丰富的工具来帮助开发者实现这些转换。

4.1 二进制、八进制、十六进制转换为十进制

在 Java 中,可以使用 Integer.parseInt 方法将二进制、八进制、或十六进制字符串转换为十进制整数。

public class Main {
    public static void main(String[] args) {
        // 二进制转十进制
        int binaryToDecimal = Integer.parseInt("1010", 2);
 
        // 八进制转十进制
        int octalToDecimal = Integer.parseInt("12", 8);
 
        // 十六进制转十进制
        int hexToDecimal = Integer.parseInt("1A", 16);
 
        System.out.println("二进制 1010 转为十进制: " + binaryToDecimal);
        System.out.println("八进制 12 转为十进制: " + octalToDecimal);
        System.out.println("十六进制 1A 转为十进制: " + hexToDecimal);
    }
}

输出结果

二进制 1010 转为十进制: 10
八进制 12 转为十进制: 10
十六进制 1A 转为十进制: 26

4.2 十进制转换为二进制、八进制、十六进制

Java 提供了 Integer.toBinaryStringInteger.toOctalStringInteger.toHexString 方法,分别用于将十进制整数转换为二进制、八进制和十六进制字符串。

public class Main {
    public static void main(String[] args) {
        int number = 26;
 
        // 十进制转二进制
        String decimalToBinary = Integer.toBinaryString(number);
 
        // 十进制转八进制
        String decimalToOctal = Integer.toOctalString(number);
 
        // 十进制转十六进制
        String decimalToHex = Integer.toHexString(number);
 
        System.out.println("十进制 26 转为二进制: " + decimalToBinary);
        System.out.println("十进制 26 转为八进制: " + decimalToOctal);
        System.out.println("十进制 26 转为十六进制: " + decimalToHex);
    }
}

输出结果

十进制 26 转为二进制: 11010
十进制 26 转为八进制: 32
十进制 26 转为十六进制: 1a

4.3 进制转换对照表格

下表展示了从 031 的数字在二进制、八进制、十进制和十六进制中的表示:

十进制 (Decimal)二进制 (Binary)八进制 (Octal)十六进制 (Hexadecimal)
00000000
10000111
20001022
30001133
40010044
50010155
60011066
70011177
801000108
901001119
100101012A
110101113B
120110014C
130110115D
140111016E
150111117F
16100002010
17100012111
18100102212
19100112313
20101002414
21101012515
22101102616
23101112717
24110003018
25110013119
2611010321A
2711011331B
2811100341C
2911101351D
3011110361E
3111111371F