进制转换器,免费
在二进制、八进制、十进制和十六进制之间转换。
理解数字进制
数字进制(或基数)决定了用多少个独特的数字来表示数字。最熟悉的是十进制(基数 10),使用数字 0–9。计算机原生使用二进制(基数 2),只有 0 和 1。
- 二进制(基数 2):被所有数字系统在内部使用。每个数字是一个「比特」。
- 八进制(基数 8):使用 0–7 的数字。常用于 Unix 文件权限(如 chmod 755)。
- 十进制(基数 10):人类标准的数字系统。
- 十六进制(基数 16):使用 0–9 和 A–F。广泛用于颜色(#FF0000)、内存地址和字节表示。
常见问题
支持非常大的数字吗?
支持。此工具使用 JavaScript 的 BigInt,可在无精度损失的情况下处理任意大的整数。您可以转换几百位的数字。
为什么二进制在计算机中如此重要?
计算机使用两种状态的电信号(开/关),这自然对应于二进制(1/0)。所有数据 · 文本、图片、视频 · 最终都以二进制存储和处理。
位置记数法的原理
位置记数法使用一组固定的数字符号来表示数字,每个数字的位置决定其权重。位置 i(从右侧从零开始计数)的权重为 base^i。数字的值是所有位置上 digit × base^i 的总和。十进制中的字符串 352 表示 3×100 + 5×10 + 2×1 = 352。二进制中的字符串 1011 表示十进制的 1×8 + 0×4 + 1×2 + 1×1 = 11。
位置记数法是数字表示的两大发明之一。另一种是非位置制(罗马数字、埃及僧侣体),其中符号无论位置如何都有固定的值。位置制可以压缩;非位置制不能,数字1,888在十进制中只需四位,但用罗马数字写成MDCCCLXXXVIII需要八个字符。
进制的简史
巴比伦人至少在古巴比伦时期(约公元前1900-1600年)就使用六十进制(base-60)位置记数法。那个时代的楔形文字泥板已经使用位置记数法。为什么是60?它拥有异常多的小因数(1、2、3、4、5、6、10、12、15、20、30、60),这使得在小数分数出现之前的世界里分数运算更加便捷。巴比伦的遗产至今仍在您的生活中:时间(60秒一分钟,60分钟一小时)以及角度/地理坐标(圆周360度,每度60分,每分60秒)都是直接的遗存。当您看时钟或读经纬度时,您就在使用六十进制。
我们今天所知的十进制位置系统由印度数学家在公元最初几个世纪发展而来。使其有别于早期计数板的概念性飞跃是用于占位的零的书写符号。零在位置记数法语境中最早无歧义的使用一般归功于婆罗摩笈多(628年),其著作Brāhmasphuṭasiddhānta给出了零参与运算的规则。巴赫沙利手稿显示了更早使用点(bindu)作为占位符的情形。
十进制系统在8至9世纪从印度传入伊斯兰世界,波斯博学家花拉子密(al-Khwārizmī)约于825年写成《印度数字计算法》(「algorithm」和「algebra」这两个词在词源上分别源于他的名字和著作名)。欧洲落后了。比萨的列奥纳多,即斐波那契在《计算之书》(Liber Abaci)(1202年)中正式将印度-阿拉伯数字引入拉丁欧洲,展示了其相较于罗马数字的优越性。罗马数字在欧洲簿记中一直延续到16世纪。
戈特弗里德·威廉·莱布尼茨在1703年的论文《二进制算术阐释》中描述了一个完整的二进制数系统,但其主要动机是哲学性的(与《易经》的对应关系),而非实用性的。将二进制运用于计算的飞跃来自克劳德·香农1937年在麻省理工的硕士论文「A Symbolic Analysis of Relay and Switching Circuits」,该文证明了布尔代数可以模拟电气继电器网络,使二进制成为数字逻辑的自然语言。
转换算法
十进制转其他进制,反复除法。将十进制整数N转换为 b 进制:用N除以 b,记录余数,用商替换N,重复直至商为0。从下到上读余数即为 b 进制的各位数字。156转二进制的示例:156÷2 = 78 r0,78÷2 = 39 r0,39÷2 = 19 r1,19÷2 = 9 r1,9÷2 = 4 r1,4÷2 = 2 r0,2÷2 = 1 r0,1÷2 = 0 r1,从下到上读余数:10011100。验证:128 + 16 + 8 + 4 = 156。
其他进制转十进制,霍纳法。从0开始;从左到右逐位遍历,将当前总和乘以进制基数后加上新数字。十六进制 1F4 的示例:0×16 + 1 = 1,然后1×16 + 15 = 31,然后31×16 + 4 = 500。
两种算法相对于数字位数均以线性时间运行,JavaScript的 BigInt 在底层实现了它们,这就是为什么本工具没有精度上限。一个200位的数字可以在任意两个进制之间无损转换,就像具有任意精度整数运算能力的计算器一样。
计算中最重要的四种进制
- 二进制(base 2):晶体管有开有关,因此二进制是数字逻辑的自然表示法。最终,每一条数据都是二进制的。
- 八进制(base 8):在早期计算中历史上很常见,因为3个二进制位恰好对应1个八进制位。如今不那么突出,但仍用于Unix文件权限(
chmod 755)和某些遗留文件格式。 - 十进制(base 10):日常使用的人类数字系统,几乎可以肯定是因为我们有十根手指。用于金融系统、科学以及所有人类需要读数的场合。
- 十六进制(base 16):每位精确对应4个比特,即1字节 = 2个十六进制字符。紧凑字节级表示的事实标准:十六进制颜色代码(
#FF0000)、内存地址(0x7fff...)、Unicode码位(U+1F600)、MAC地址、哈希摘要。
值得记忆的2的幂次
| 次幂 | 十进制 | 十六进制 | 为何重要 |
|---|---|---|---|
| 2⁸ | 256 | 0x100 | 1字节;8位通道(RGB)的最大值 |
| 2¹⁰ | 1,024 | 0x400 | 「1K」在计算领域的含义 |
| 2¹⁶ | 65,536 | 0x10000 | UTF-16 BMP大小;16位整数最大值 |
| 2²⁰ | 1,048,576 | 0x100000 | 「1M」在计算领域的含义 |
| 2²⁴ | 16,777,216 | 0x1000000 | 24位RGB(「16.7M色」) |
| 2³² | 约43亿 | 0x100000000 | 32位无符号整数最大值;IPv4地址空间 |
| 2⁶⁴ | ~1.8×10¹⁹ | 0x100… | 64位整数最大值;远超浮点精度范围 |
何时需要进制转换器
- 读取十六进制转储(来自调试器、网络数据包捕获或二进制文件)。在脑中将
0xFF转换为255还算轻松;但0x7F4A通常不行。 - CSS颜色代码:
#FF0000就是十进制的(255, 0, 0)。十六进制转RGB的过程恰好是对每个双字符对进行base 16 → base 10的转换。 - Unix文件权限:
chmod 755是八进制:7 = rwx(读+写+执行 = 4+2+1),5 = r-x(读+执行 = 4+1),最后一个5同上。每个八进制位恰好对应3个二进制位。 - IPv4八位组:像
192.168.1.1这样的地址是四个8位数字。子网掩码用二进制更易理解(/24掩码是24个1后跟8个0)。 - Unicode码位:字符以十六进制编目(U+2665表示♥,U+1F600表示😀)。十进制等价值虽然存在,但十六进制形式与Unicode字符表相对应。
- 位掩码运算:功能标志、权限位、硬件寄存器值,以二进制或十六进制阅读都比十进制更直观。
- 调试汇编或反汇编代码:地址、操作码和立即数按惯例写成十六进制。
其他值得了解的进制
- 36进制:可用字母数字字符无需特殊字符表示的最高进制(10个数字 + 26个字母)。用于短URL哈希和部分编码方案。JavaScript的
Number.toString(36)直接提供了该功能。 - 58进制:用于比特币和瑞波币地址。跳过了容易混淆的字符
0(零)、O(大写O)、I(大写I)和l(小写l),使地址在手写转录时不易出错。 - 62进制:全字母数字(数字 + 小写 + 大写字母)。常用于短链接缩略标识(
example.com/abc123中的「abc123」就是此类示例)。 - 64进制:将二进制数据编码为可打印的ASCII字符,用于通过纯文本信道传输(电子邮件、JSON、URL)。与本工具的适用范围不同,它作用于字节流而非整数。
源代码前缀约定
大多数现代编程语言使用同一套字面量前缀来区分源码中的进制:
- 二进制:
0b或0B(Python、Ruby、Java 7起、C++14起、ES6起的JavaScript、Rust)。示例:0b10011100。 - 八进制:
0o或0O(Python 3、ES6、Rust)。旧式C族语言使用前导零(0755),如果不小心给十进制数添加了前导零会偶尔造成错误。 - 十六进制:
0x或0X:几乎所有编程语言都通用。 - 十进制:无需前缀。
更多问题
负数怎么处理?
计算机使用二进制补码表示负整数:将所有位取反后加1。因此,在8位二进制补码中,−1是 11111111(0xFF),−5是 11111011(0xFB),−128是 10000000(0x80)。最高有效位表示符号。本工具以前导负号而非二进制补码形式显示负整数,因为后者只在固定位宽下才有意义,而由于本工具使用任意精度的 BigInt,没有可以参照的固定位宽。
十六进制为何使用字母A-F?
因为16进制需要16个不同的数字符号,而十进制数字0-9只提供了十个。使用A-F(不区分大小写)表示10-15的惯例由IBM System/360在1960年代推广并在行业内标准化。早期系统曾尝试其他符号(Bendix G-15使用u、v、w、x、y、z),但A-F获胜。
本工具能处理分数吗?
不能,仅限整数。分数进制转换更为复杂,因为大多数十进制分数在二进制中没有精确表示(著名的 0.1 + 0.2 ≠ 0.3 浮点问题)。要进行浮点数位级检查,应使用专用的IEEE 754可视化工具。
有任何内容会发送至服务器吗?
不会。转换在您的浏览器中使用JavaScript原生的 BigInt 运算执行。您的输入内容不会离开页面;页面加载后即可离线使用。