在二进制、八进制、十进制和十六进制之间重写同一个值
数字进制(或”基数”)是指一个数字系统在进位到下一个位值之前所使用的不同数字符号的数量 — 十进制使用 10 个(0-9),二进制使用 2 个(0-1),八进制使用 8 个(0-7),十六进制使用 16 个(0-9,然后是 A-F)。输入这四种进制中任意一种的整数,此计算器将同时以全部四种进制显示相同的值。
二进制是计算机在内部表示每个值的方式(每个数字是一个”比特”);十六进制是编程中二进制的常见简写形式(每个十六进制数字恰好代表 4 个二进制数字,因此阅读和输入起来紧凑得多);八进制出现在较旧的 Unix 文件权限和一些底层场景中。十进制就是日常使用的十进制系统。
计算公式
每种位置数字系统的工作原理都相同:每个数字乘以基数的相应位值次幂,然后求和:
其中 是位置 处的数字(从最右边的数字开始计为 0)。转换为另一种进制则是反复用新进制去除十进制值,并记录每次的余数 — 这是上述求和过程的逆过程。
举例说明
将二进制 11111111 转换为其他三种进制:
- 从右到左读取,每个
1贡献其位值:。 - 十进制:255。
- 八进制:反复用 8 除 255(255 ÷ 8 = 31 余 7,31 ÷ 8 = 3 余 7,3 ÷ 8 = 0 余 3), 从下到上读取余数得到 377。
- 十六进制:255 ÷ 16 = 15 余 15,15 ÷ 16 = 0 余 15 — 两个余数都是 15(十六进制中的 F), 得到 FF。
需要考虑的关键因素
- 一个字节(8 位)恰好可以表示 256 个不同的值——十进制的 0 到 255,或十六进制的 00 到 FF。 这正是为什么 255/FF 在计算机领域是如此常见的参考值——它是单个字节能容纳的最大值,从 RGB 颜色通道(每通道 0-255)到网络和文件格式,随处可见。
- 八进制在历史上比现在更常用,很大程度上是因为旧式计算机的字长。 八进制(以 8 为基数)能整齐地对应到每组 3 个二进制数字,适合字长为 3 的倍数的计算机——现代计算已在很大程度上转向十六进制(对应每组 4 位),因为大多数现代硬件的字长是 4 和 8 的倍数,不过八进制仍出现在一些特定场景中,例如 Unix 文件权限表示法(如 chmod 755)。
- 一个常见的程序员错误是仅凭上下文就混淆了一个数字的进制。 数字”10”根据进制不同代表截然不同的值——十进制中是 10,二进制中是 2,八进制中是 8,十六进制中是 16——这正是为什么编程语言通常要求显式前缀(如十六进制的 0x 或二进制的 0b)来消除对所用进制的任何歧义。
- 理论上任何整数都可以用任意进制表示,而不仅限于这四种。 二进制、八进制、十进制和十六进制只是在计算机和日常数学中最常用的四种进制——本计算器所使用的同一位置记数原理,可以推广到任意进制,比如三进制、二十进制,或六十进制(时间和角度传统上按此划分的基础)。
常见错误
- 在没有前缀的情况下,默认将混合进制的数字当作十进制读取。 “10” 在十进制中表示十,但在二进制中只表示二——在对某个数字进行运算之前,务必先检查(或注明)它是用哪种进制书写的。
- 假设前导零会改变数值。 就像十进制一样,二进制中的
0011与11的值相同——前导零只在固定宽度格式(例如显示完整一个字节)时才有意义,并不改变数字本身的实际值。 - 忘记大于 9 的十六进制数字使用字母而非两位数字。 十六进制的十写作
A,而不是10——在十六进制中写10实际上表示十进制的十六,这是造成严重误差的常见根源。 - 试图直接转换负数。 正如上面的常见问题所述,负的二进制/十六进制值取决于所选定的位宽和补码约定——不像非负整数那样存在唯一明确的转换方式。