进制转换是计算机科学和编程的基础知识。理解不同进制系统及其转换方法,对于理解计算机底层原理、调试程序和处理数据都至关重要。本指南将深入讲解各种进制系统和转换方法。

目录

核心要点

  • 进制基数:二进制(2)、八进制(8)、十进制(10)、十六进制(16)
  • 位权展开:任何进制数都可以按位权展开为十进制
  • 短除法:十进制转其他进制的通用方法
  • 分组转换:二进制与八进制、十六进制可以直接分组转换
  • 编程应用:内存地址、颜色值、权限等广泛使用不同进制

需要快速进行进制转换?试试我们的免费在线工具:

立即使用进制转换器

常用进制系统

二进制(Binary,基数2)

计算机内部使用的基本进制,只有0和1两个数字。

二进制: 1010 1100
前缀表示: 0b10101100 或 10101100B

特点:

  • 直接对应计算机硬件的开/关状态
  • 每一位称为一个比特(bit)
  • 8位组成一个字节(byte)

八进制(Octal,基数8)

使用0-7共8个数字,常用于Unix文件权限。

八进制: 754
前缀表示: 0o754 或 0754

特点:

  • 每个八进制位对应3个二进制位
  • Unix/Linux文件权限使用八进制表示
  • 现代编程中使用较少

十进制(Decimal,基数10)

日常生活中使用的进制,使用0-9共10个数字。

十进制: 1234
无特殊前缀

十六进制(Hexadecimal,基数16)

使用0-9和A-F共16个字符,广泛用于编程。

十六进制: 1A2B
前缀表示: 0x1A2B 或 1A2Bh

特点:

  • 每个十六进制位对应4个二进制位
  • 内存地址、颜色值常用十六进制
  • 一个字节可以用两个十六进制数表示

进制转换原理

位权展开法(任意进制转十进制)

任何进制的数都可以按位权展开为十进制:

数值 = Σ(数字 × 基数^位置)

示例:二进制 1011 转十进制

1011₂ = 1×2³ + 0×2² + 1×2¹ + 1×2⁰
      = 8 + 0 + 2 + 1
      = 11₁₀

示例:十六进制 2F 转十进制

2F₁₆ = 2×16¹ + 15×16⁰
     = 32 + 15
     = 47₁₀

短除法(十进制转任意进制)

将十进制数不断除以目标基数,记录余数:

示例:十进制 47 转二进制

47 ÷ 2 = 23 ... 1
23 ÷ 2 = 11 ... 1
11 ÷ 2 = 5  ... 1
5  ÷ 2 = 2  ... 1
2  ÷ 2 = 1  ... 0
1  ÷ 2 = 0  ... 1

结果(从下往上读): 101111₂

分组转换法

二进制与八进制、十六进制可以直接分组转换:

二进制 ↔ 八进制(3位一组)

二进制:  101 111 010
八进制:   5   7   2

二进制 ↔ 十六进制(4位一组)

二进制:    1011 1101 0010
十六进制:    B    D    2

转换方法详解

二进制 ↔ 十进制

二进制 十进制 计算过程
1 1 1×2⁰ = 1
10 2 1×2¹ + 0×2⁰ = 2
100 4 1×2² = 4
1000 8 1×2³ = 8
1111 15 8+4+2+1 = 15
10000 16 1×2⁴ = 16
11111111 255 128+64+32+16+8+4+2+1 = 255

十六进制 ↔ 十进制

十六进制 十进制 二进制
0 0 0000
1 1 0001
9 9 1001
A 10 1010
B 11 1011
C 12 1100
D 13 1101
E 14 1110
F 15 1111
10 16 0001 0000
FF 255 1111 1111
100 256 0001 0000 0000

八进制 ↔ 十进制

八进制 十进制 二进制
0 0 000
7 7 111
10 8 001 000
77 63 111 111
100 64 001 000 000
777 511 111 111 111

代码示例

JavaScript

// 十进制转其他进制
const decimal = 255;
console.log(decimal.toString(2));   // "11111111" (二进制)
console.log(decimal.toString(8));   // "377" (八进制)
console.log(decimal.toString(16));  // "ff" (十六进制)

// 其他进制转十进制
console.log(parseInt('11111111', 2));  // 255
console.log(parseInt('377', 8));       // 255
console.log(parseInt('ff', 16));       // 255

// 使用字面量
const binary = 0b11111111;    // 255
const octal = 0o377;          // 255
const hex = 0xff;             // 255

// 格式化输出
function formatNumber(num) {
  return {
    decimal: num,
    binary: '0b' + num.toString(2),
    octal: '0o' + num.toString(8),
    hex: '0x' + num.toString(16).toUpperCase()
  };
}

console.log(formatNumber(255));
// { decimal: 255, binary: '0b11111111', octal: '0o377', hex: '0xFF' }

Python

# 十进制转其他进制
decimal = 255
print(bin(decimal))   # '0b11111111'
print(oct(decimal))   # '0o377'
print(hex(decimal))   # '0xff'

# 其他进制转十进制
print(int('11111111', 2))  # 255
print(int('377', 8))       # 255
print(int('ff', 16))       # 255

# 使用字面量
binary = 0b11111111   # 255
octal = 0o377         # 255
hexadecimal = 0xff    # 255

# 格式化输出
num = 255
print(f"十进制: {num}")
print(f"二进制: {num:b}")
print(f"八进制: {num:o}")
print(f"十六进制: {num:x}")
print(f"十六进制(大写): {num:X}")

# 带前缀格式化
print(f"二进制: {num:#b}")    # 0b11111111
print(f"八进制: {num:#o}")    # 0o377
print(f"十六进制: {num:#x}")  # 0xff

Java

public class BaseConverter {
    public static void main(String[] args) {
        int decimal = 255;
        
        // 十进制转其他进制
        System.out.println(Integer.toBinaryString(decimal));  // 11111111
        System.out.println(Integer.toOctalString(decimal));   // 377
        System.out.println(Integer.toHexString(decimal));     // ff
        
        // 其他进制转十进制
        System.out.println(Integer.parseInt("11111111", 2));  // 255
        System.out.println(Integer.parseInt("377", 8));       // 255
        System.out.println(Integer.parseInt("ff", 16));       // 255
        
        // 使用字面量
        int binary = 0b11111111;   // 255
        int octal = 0377;          // 255
        int hex = 0xff;            // 255
        
        // 格式化输出
        System.out.printf("十进制: %d%n", decimal);
        System.out.printf("二进制: %s%n", Integer.toBinaryString(decimal));
        System.out.printf("八进制: %o%n", decimal);
        System.out.printf("十六进制: %x%n", decimal);
    }
}

实际应用场景

1. 颜色表示

/* 十六进制颜色 */
color: #FF5733;           /* RGB: 255, 87, 51 */
color: #F53;              /* 简写: #FF5533 */
background: rgba(255, 87, 51, 0.5);  /* 带透明度 */

2. 文件权限(Unix/Linux)

# 八进制权限表示
chmod 755 script.sh   # rwxr-xr-x
chmod 644 file.txt    # rw-r--r--

# 权限位说明
# 7 = 111 = rwx (读+写+执行)
# 5 = 101 = r-x (读+执行)
# 4 = 100 = r-- (只读)

3. 内存地址

// C语言中的内存地址
int *ptr = (int *)0x7fff5fbff8ac;
printf("地址: %p\n", ptr);  // 0x7fff5fbff8ac

4. 位运算

// 位运算使用二进制
const READ = 0b001;    // 1
const WRITE = 0b010;   // 2
const EXECUTE = 0b100; // 4

let permission = READ | WRITE;  // 0b011 = 3
console.log(permission & READ);  // 1 (有读权限)
console.log(permission & EXECUTE);  // 0 (无执行权限)

5. IP地址

// IPv4地址可以用十进制或十六进制表示
// 192.168.1.1 = 0xC0A80101 = 3232235777

function ipToDecimal(ip) {
  return ip.split('.').reduce((acc, octet) => (acc << 8) + parseInt(octet), 0) >>> 0;
}

console.log(ipToDecimal('192.168.1.1'));  // 3232235777
console.log((3232235777).toString(16));   // c0a80101

常见问题

为什么计算机使用二进制?

计算机硬件基于电子开关,只有开(1)和关(0)两种状态,二进制正好对应这两种状态,实现简单可靠。

为什么十六进制在编程中很常用?

十六进制与二进制转换方便(4位二进制=1位十六进制),且比二进制更紧凑易读。一个字节(8位)可以用两个十六进制数表示。

如何快速判断二进制数的大小?

记住2的幂次:1, 2, 4, 8, 16, 32, 64, 128, 256... 二进制数的最高位1的位置决定了数的大致范围。

负数如何用二进制表示?

计算机通常使用补码表示负数。例如,8位有符号整数中,-1表示为11111111。

总结

进制转换是编程和计算机科学的基础技能。掌握不同进制系统及其转换方法,有助于理解计算机底层原理和解决实际编程问题。

快速总结:

  • 二进制是计算机的基础,每位对应一个比特
  • 十六进制常用于内存地址、颜色值等
  • 八进制常用于Unix文件权限
  • 位权展开法用于转十进制,短除法用于十进制转其他进制
  • 二进制与八进制、十六进制可以直接分组转换

需要快速进行进制转换?试试我们的免费在线工具:

立即使用进制转换器