📝 博客 · · ⏱ 9 分钟

进制转换详解:二进制/十进制/十六进制互转方法

二进制、十进制、十六进制怎么互转?本文详解各进制转换的手动计算方法和编程实现,附在线进制转换器,程序员必看。

进制转换编程基础开发工具

进制转换详解:二进制/十进制/十六进制互转方法

程序员每天和进制打交道:IP地址用十进制、内存地址用十六进制、底层逻辑用二进制。搞不清进制转换,调试程序、阅读文档都会一头雾水。本文从原理到实操,一次讲透。

什么是进制

进制是计数的方法,决定了"逢几进一":

每种进制的基本信息:

进制基数数字符号后缀前缀
二进制20,1B0b
八进制80-7O0o
十进制100-9D
十六进制160-9,A-FH0x

二进制与十进制互转

二进制转十进制

方法:按权展开求和。每一位乘以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)

对照表

二进制十六进制十进制
000000
000111
001022
001133
010044
010155
011066
011177
100088
100199
1010A10
1011B11
1100C12
1101D13
1110E14
1111F15

程序员的常见进制场景

场景一:颜色值

CSS颜色用十六进制表示:#FF5733

进制转换器 快速将十六进制颜色值转为十进制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(十进制),转成:

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

记住核心原则:二进制是基础,十六进制是简写,十进制是日常。用 在线进制转换器 随时快速转换。