进制转换是计算机科学和编程的基础知识。理解不同进制系统及其转换方法,对于理解计算机底层原理、调试程序和处理数据都至关重要。本指南将深入讲解各种进制系统和转换方法。
目录
核心要点
- 进制基数:二进制(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文件权限
- 位权展开法用于转十进制,短除法用于十进制转其他进制
- 二进制与八进制、十六进制可以直接分组转换
需要快速进行进制转换?试试我们的免费在线工具: