进制转换工具
在线进制转换工具,支持二进制、八进制、十进制、十六进制及自定义进制互转
输入进制
什么是进制转换?
进制转换是将一个数字从一种数制表示法转换为另一种表示法的过程。常见的进制包括二进制(基数2)、八进制(基数8)、十进制(基数10)和十六进制(基数16)。
在计算机科学中,二进制是最基本的数制,因为计算机内部所有数据都以二进制形式存储。十六进制常用于表示内存地址和颜色值,因为它比二进制更紧凑且易于阅读。八进制在Unix文件权限等场景中也有广泛应用。
使用方法
使用步骤
- 在输入框中输入要转换的数字(如 255、FF、11111111)
- 选择输入数字的进制:二进制、八进制、十进制、十六进制或自定义进制
- 工具自动将输入转换为二进制、八进制、十进制和十六进制
- 点击结果旁的「复制」按钮即可复制到剪贴板
转换提示
- 确保输入的数字在所选进制下有效;例如,二进制只接受 0 和 1,十六进制接受 0-9 和 A-F。
- 大整数在某些场景下可能超出 JavaScript 安全数字范围,因此请用专用任意精度工具验证关键工程数值。
使用场景
技术原理
进制转换是位值记数法的算术运算。在基数 b 中,位置 p 上的数字 d 对总值的贡献为 d × b^p,一个 N 位数的值为 Σᵢ₌₀..N₋₁ dᵢ × b^(N-1-i)。十进制是基数 10,二进制是基数 2,八进制是基数 8,十六进制是基数 16。两个核心算法完成所有工作:从基数 b₁ 转换为十进制时,计算多项式值(Horner 方法是标准的原地形式:`value = value * b₁ + digit`);从十进制转换为基数 b₂ 时,反复除以 b₂ 并收集余数,然后反转。两种算法的时间复杂度为 O(N)(每位),额外空间为 O(1),适用于 2 到 36 之间的任意基数(数字 '0'-'9' + 'A'-'Z' 对应 10-35)。 大多数实际的进制转换工作会跳过中间的十进制步骤,直接在 2 的幂次基数之间转换。二进制 ↔ 八进制将每 3 位二进制分为一组对应一个八进制位(因为 2³ = 8),二进制 ↔ 十六进制将每 4 位分为一组对应一个十六进制位(2⁴ = 16)。这就是为什么 0xFF = 11111111₂,0755(八进制,Unix 文件权限)= 111101101₂ = 493(十进制)。本页面还支持基数 32(RFC 4648 §6,用于某些认证令牌)和基数 36(传统紧凑 URL 短链字母表 '0'-'9' + 'A'-'Z'),由于 32 和 36 不是 2 的幂,转换为二进制是唯一合理的方式。 本页面使用 JavaScript 内置的 parseInt(value, base) 进行解析,使用 (123).toString(base) 进行输出。两者都受 Number 精度限制:IEEE 754 binary64 有 53 位尾数,因此大于 2⁵³ - 1 = 9,007,199,254,740,991 的整数值会丢失精度。例如,Number.MAX_SAFE_INTEGER + 1 等于 Number.MAX_SAFE_INTEGER + 2 —— 这两个大值无法精确表示。对于任意精度的整数进制转换,BigInt 是现代方案:BigInt 中的 parseInt 式逻辑很直接,BigInt.prototype.toString(base) 支持 2 到 36 之间的任意基数。加密库、UUID 生成器和大数运算(BIP-32 HD 钱包、RSA 密钥)都出于这个原因使用 BigInt。 同样的算法也可以处理有符号数和浮点数,但有一些注意事项。在补码表示法中(从 1965 年 IBM System/360 设计开始,所有现代 CPU 都使用的主流有符号整数表示法),-1 是全 1(32 位为 0xFFFFFFFF,64 位为 0xFFFFFFFFFFFFFFFF),最高位是符号位。要将负的补码整数转换为十进制,需减去 2ⁿ(其中 n 为位宽)。对于浮点数,IEEE 754 binary64 存储符号位(1 位)、指数(11 位,偏移量 1023)和尾数(52 位,隐含前导 1)。因此任意 binary64 的十进制转换并非精确的 —— IEEE 754 中的 0.1 实际上是 0.1000000000000000055511151231257827021181583404541015625,这就是为什么金融代码使用整数分或 decimal 库而非浮点数。
- 位值记数法:在基数 b 中,位置 p 上的数字 d 贡献 d × b^p。一个 N 位数的完整值为 Σᵢ dᵢ × b^(N-1-i)。Horner 方法在 O(N) 时间和 O(1) 空间内求值:`value = value * b + digit`。
- 从十进制转换为基数 b:反复除以 b 并收集余数;反向读取即为目标表示。对于 N 位输出,算法复杂度为 O(N)。
- 直接的二进制 ↔ 十六进制转换:每个十六进制位恰好对应 4 位二进制,因此 0xFF = 11111111₂。二进制 ↔ 八进制:每个八进制位对应 3 位二进制,因此 0755 = 111101101₂。
- 补码(所有现代 CPU 用于有符号整数的表示法):高位为符号位,负数编码为 2ⁿ - |x|。32 位补码中的 -1 为 0xFFFFFFFF。
- IEEE 754 binary64(JavaScript Number):1 位符号位 + 11 位偏移指数(偏移量 1023)+ 52 位尾数(隐含前导 1)。最大安全整数为 2⁵³ - 1 = 9,007,199,254,740,991;超出此值会丢失精度。
- parseInt(value, base) 和 Number.prototype.toString(base) 支持 2-36 进制,使用 53 位 Number 尾数。需要任意精度时,使用 BigInt('value', base) 和 BigInt.prototype.toString(base)。
- 基数 32(RFC 4648 §6)和基数 36('0'-'9' + 'A'-'Z')需要二进制作为中间步骤,因为 32 和 36 不是 2 的幂 —— 一个数字不对应固定的比特数。
- 边界情况:负基数或补码中有符号数的带余整数除法需要符号处理;本页面将输入视为无符号绝对值,并在最终结果上重新应用符号。
示例
十进制转十六进制
输入: 255 (十进制)
输出: FF (十六进制)
说明: 常见于 CSS 颜色值,比如红色就是 #FF0000二进制转十进制
输入: 11111111 (二进制)
输出: 255 (十进制)
说明: 8 位二进制的最大值,也就是无符号字节的上限十六进制转二进制
输入: 1A3F (十六进制)
输出: 1101000111111 (二进制)
说明: 每 4 位二进制对应 1 位十六进制八进制转十六进制
输入: 377 (八进制)
输出: FF (十六进制)
说明: Unix 权限 377 (rwxrwxrwx) 等于十六进制 FF自定义进制(36 进制)
输入: ZZ (36 进制)
输出: 1295 (十进制)
说明: 36 进制使用 0-9 和 A-Z;ZZ 是该进制下的最大两位数常见问题
支持哪些进制?
二进制(2 进制)、八进制(8 进制)、十进制(10 进制)、十六进制(16 进制),以及 2 到 36 之间任意自定义进制。超过 36 的进制需要扩展字母表,超出本工具范围。
高于 10 进制时字母怎么表示?
10 以上的进制用字母补足:十六进制中 A=10、B=11……F=15;36 进制中从 A=10 一直到 Z=35。输入大小写均可,输出默认大写。
怎么转换负数或小数?
负整数可直接转换——内部使用 JavaScript 的 BigInt 或带符号整数存储。小数(例如十进制 0.5 → 二进制 0.1)也支持,但因浮点精度限制,最多大约 15 位有效数字。
二进制补码和原码(带符号位)有什么区别?
二进制补码是计算机存储负整数的方式——最高位表示符号,其余位编码数值加偏移。原码只是单纯翻转一个符号位。本页面通常以原码风格显示(类似十进制带正负号),不直接显示补码位模式。如果需要看补码,请使用程序员模式计算器。
为什么我的十六进制结果与别的工具补零长度不同?
十六进制数值前面是否补零并不固定。0xff 和 0x000000FF 是同一个数,只是显示宽度不同。本页面不会自动补零;如果场景需要固定宽度(例如 MAC 地址、IPv6 段),请手动补足前导零。
对数值大小有限制吗?
JavaScript 的 BigInt 可处理任意大小的整数,因此整数之间的进制转换在实际场景下没有长度限制。小数转换则受 Number 的 15-17 位有效数字精度限制。
可以用它转换 IP 地址或颜色代码吗?
可以间接处理:把每段单独转换。点分十进制 IP 可逐段把十进制转成十六进制;#RRGGBB 颜色代码可拆成三段两位字节分别转换。如需自动解析,使用专门的 IP 工具或颜色工具会更方便。