进制转换详解:二进制/十进制/十六进制互转方法
程序员每天和进制打交道:IP地址用十进制、内存地址用十六进制、底层逻辑用二进制。搞不清进制转换,调试程序、阅读文档都会一头雾水。本文从原理到实操,一次讲透。
什么是进制
进制是计数的方法,决定了"逢几进一":
- 十进制(Decimal):逢10进1,使用0-9,日常使用的计数方式
- 二进制(Binary):逢2进1,使用0和1,计算机底层语言
- 八进制(Octal):逢8进1,使用0-7,Unix文件权限常用
- 十六进制(Hexadecimal):逢16进1,使用0-9和A-F,内存地址和颜色值常用
每种进制的基本信息:
| 进制 | 基数 | 数字符号 | 后缀 | 前缀 |
| 二进制 | 2 | 0,1 | B | 0b |
| 八进制 | 8 | 0-7 | O | 0o |
| 十进制 | 10 | 0-9 | D | 无 |
| 十六进制 | 16 | 0-9,A-F | H | 0x |
二进制与十进制互转
二进制转十进制
方法:按权展开求和。每一位乘以2的相应次幂,然后相加。
以 1011 为例:
1 0 1 1
× × × ×
2³ 2² 2¹ 2⁰
= = = =
8 0 2 1
8 + 0 + 2 + 1 = 11
所以 1011(B) = 11(D)。
十进制转二进制
方法:除2取余,逆序排列。不断除以2,记录余数,最后将余数从下往上排列。
以 25 为例:
25 ÷ 2 = 12 ... 余 1
12 ÷ 2 = 6 ... 余 0
6 ÷ 2 = 3 ... 余 0
3 ÷ 2 = 1 ... 余 1
1 ÷ 2 = 0 ... 余 1
从下往上读余数:11001
所以 25(D) = 11001(B)。
验证:1×2⁴ + 1×2³ + 0×2² + 0×2¹ + 1×2⁰ = 16 + 8 + 0 + 0 + 1 = 25 ✓
十六进制与十进制互转
十六进制转十进制
方法:按权展开求和,A=10, B=11, C=12, D=13, E=14, F=15。
以 2F 为例:
2 F
× ×
16¹ 16⁰
= =
32 15
32 + 15 = 47
所以 2F(H) = 47(D)。
十进制转十六进制
方法:除16取余,逆序排列。
以 255 为例:
255 ÷ 16 = 15 ... 余 15 (F)
15 ÷ 16 = 0 ... 余 15 (F)
从下往上读:FF
所以 255(D) = FF(H)。
二进制与十六进制互转
这是最简单的转换,因为16 = 2⁴,所以每4位二进制对应1位十六进制。
二进制转十六进制
方法:从右往左每4位一组,每组转成对应的十六进制数字。
以 11010111 为例:
1101 0111
D 7
所以 11010111(B) = D7(H)。
十六进制转二进制
方法:每位十六进制转成4位二进制。
以 A3 为例:
A 3
1010 0011
所以 A3(H) = 10100011(B)。
对照表:
| 二进制 | 十六进制 | 十进制 |
| 0000 | 0 | 0 |
| 0001 | 1 | 1 |
| 0010 | 2 | 2 |
| 0011 | 3 | 3 |
| 0100 | 4 | 4 |
| 0101 | 5 | 5 |
| 0110 | 6 | 6 |
| 0111 | 7 | 7 |
| 1000 | 8 | 8 |
| 1001 | 9 | 9 |
| 1010 | A | 10 |
| 1011 | B | 11 |
| 1100 | C | 12 |
| 1101 | D | 13 |
| 1110 | E | 14 |
| 1111 | F | 15 |
程序员的常见进制场景
场景一:颜色值
CSS颜色用十六进制表示:#FF5733
- FF = 255(红色分量)
- 57 = 87(绿色分量)
- 33 = 51(蓝色分量)
用 进制转换器 快速将十六进制颜色值转为十进制RGB。
场景二:内存地址
调试程序时看到的内存地址:0x7FFF5FBFF8C0
这就是一个十六进制数,表示内存中的位置。
场景三:位运算
// 权限标志位
const READ = 0b0001; // 1
const WRITE = 0b0010; // 2
const EXEC = 0b0100; // 4
// 组合权限
const myPermission = READ | WRITE; // 0b0011 = 3
// 检查权限
const canWrite = (myPermission & WRITE) !== 0; // true
场景四:网络IP地址
IP地址 192.168.1.1 每一段都是十进制,转成二进制:
192 = 11000000
168 = 10101000
1 = 00000001
1 = 00000001
完整二进制:11000000.10101000.00000001.00000001
场景五:ASCII和Unicode
字符 A 的ASCII码是65(十进制),转成:
- 二进制:
01000001 - 十六进制:
0x41
Unicode字符 中 的码点是 U+4E2D,十进制是20013。
各编程语言的进制转换
JavaScript
// 十进制转其他进制
(255).toString(2); // "11111111" 二进制
(255).toString(16); // "ff" 十六进制
(255).toString(8); // "377" 八进制
// 其他进制转十进制
parseInt("11111111", 2); // 255
parseInt("FF", 16); // 255
parseInt("377", 8); // 255
// ES6进制前缀
0b11111111; // 255 二进制字面量
0o377; // 255 八进制字面量
0xFF; // 255 十六进制字面量
Python
# 十进制转其他进制
bin(255) # '0b11111111'
hex(255) # '0xff'
oct(255) # '0o377'
# 其他进制转十进制
int('11111111', 2) # 255
int('FF', 16) # 255
int('377', 8) # 255
Java
// 十进制转其他进制
Integer.toBinaryString(255); // "11111111"
Integer.toHexString(255); // "ff"
Integer.toOctalString(255); // "377"
// 其他进制转十进制
Integer.parseInt("11111111", 2); // 255
Integer.parseInt("FF", 16); // 255
在线进制转换工具
手动计算容易出错,特别是数字较大时。推荐使用 52tool进制转换器:
- 支持二进制、八进制、十进制、十六进制互转
- 实时转换,输入即出结果
- 支持大数转换
- 显示详细计算过程
配合 HTTP状态码查询 和 JSON格式化工具 可以覆盖大部分开发调试需求。
常见问题
为什么计算机用二进制?
计算机底层由晶体管组成,只有"通电"和"断电"两种状态,正好对应0和1。所以二进制是计算机的天然语言。
为什么程序员用十六进制?
十六进制是二进制的"简写"。4位二进制 = 1位十六进制,用十六进制表示更简短易读。比如 11111111 写成 FF 更方便。
八进制还有用吗?
八进制在Unix/Linux文件权限中仍然使用(如 chmod 755),但在其他场景中已经很少使用。
负数怎么表示?
计算机中用"补码"表示负数。以8位为例,-1的补码是 11111111(即0xFF)。这涉及原码、反码、补码的概念,是计算机组成原理的基础知识。
总结
| 转换类型 | 方法 | 示例 |
| 二→十 | 按权展开求和 | 1011 → 11 |
| 十→二 | 除2取余逆序 | 25 → 11001 |
| 十六→十 | 按权展开求和 | 2F → 47 |
| 十→十六 | 除16取余逆序 | 255 → FF |
| 二→十六 | 4位一组转换 | 11010111 → D7 |
| 十六→二 | 1位转4位 | A3 → 10100011 |
记住核心原则:二进制是基础,十六进制是简写,十进制是日常。用 在线进制转换器 随时快速转换。