进制转换

计算

在线进制转换:二进制与十六进制互转

进制转换是嵌入式开发、位运算和权限管理里的高频动作。读寄存器手册要看十六进制,改文件权限要用八进制,理解标志位掩码得摊开成二进制,而人脑习惯的表达又是十进制,同一个数值常常需要在几种形式之间反复切换。

这个页面把四种常用进制排成四个输入框,共享同一个数值。在任意一栏输入,其余三栏立刻更新,既不用先选源进制和目标进制,也不用点转换按钮。需要同时看到多种表示时尤其省事,比如确认权限位 755 对应的二进制到底是不是 111101101

使用时有两点需要留意。一是只处理整数,带小数点的输入会被截断到整数部分;二是解析遇到不合法字符会就地停止,在二进制栏输入 12 会被当成 1 且不报错。输入前确认字符都在该进制的合法集合内,可以避免这类静默产生的错误结果。

数值范围受 JavaScript 双精度整数的限制,约在二进制 53 位以内保持精确,超出后低位会失真。遇到 64 位整数、长哈希这类超长数值,请改用支持大整数的工具。所有换算都在浏览器本地完成,输入内容不会上传服务器。

功能一览

  • 四进制联动:二进制、八进制、十进制、十六进制共用同一个数值,改动任意一栏其余三栏同步更新
  • 即输即转:输入时实时换算,不需要点转换按钮,也不用先指定「从哪种进制转到哪种进制」
  • 十六进制规范化:输出统一使用大写字母,输入时大小写均可识别,并接受 0x 前缀
  • 非法输入提示:整串字符都不属于该进制合法字符集时(例如八进制栏输入 9)会给出格式错误提示
  • 一键清空:清空按钮同时重置四个输入框,把任意一栏内容删空也会清空全部
  • 本地计算:换算在浏览器内完成,输入的数值不会上传,页面加载后断网仍可使用
  • 输入保留:最近一次的换算结果保存在浏览器本地,刷新或重新打开页面后仍然存在

常见问题

支持哪些进制?可以做三十六进制这类任意进制转换吗?
目前提供二进制、八进制、十进制、十六进制这四种,也就是编程中最常用的四种,它们两两之间可以任意方向转换。三十六进制、五进制这类非常规底数暂不支持。如果确实需要,可以在浏览器控制台里用 parseInt(字符串, 底数) 与 数值.toString(底数) 完成,JavaScript 原生支持 2 到 36 之间的任意进制。
支持小数和负数吗?
负数支持,在十进制栏输入 -255 会得到二进制 -11111111 和十六进制 -FF,其它栏输入带负号的数值同样可以。小数不支持,内部按整数解析,小数点及其后面的部分会被直接丢弃,例如二进制栏输入 1010.11 实际只按 1010 处理,得到十进制 10。需要换算二进制小数时,请把整数部分和小数部分拆开单独计算。
输入的位数有上限吗?很长的十六进制为什么结果不对?
有上限。换算基于 JavaScript 的 Number 类型,能精确表示的整数最大是 9007199254740991,相当于十进制 16 位、二进制 53 位。超过这个值仍会算出一个结果,但低位已经被浮点舍入而失真,例如 16 个 F 组成的十六进制数得到的十进制值末尾就是错的。处理 64 位整数、长哈希或 UUID 这类超长数值时,请改用支持大整数的工具或语言内置的 BigInt。
为什么我在二进制栏输入 12,结果变成了 1?
因为解析遇到不属于该进制的字符时会就地停止,只取前面合法的那一段。二进制只认 0 和 1,输入 12 时解析到 2 就中断,实际按 1 处理,四栏也就都显示 1 对应的值。这种情况不会弹出提示,只有整串字符全部非法时(例如八进制栏输入 9、十六进制栏输入 xyz)才会提示格式不正确,所以输入前请确认每个字符都在该进制的合法范围内。
十六进制的 FF、八进制的 755 在实际开发里对应什么?
FF 是 8 位全 1,十进制为 255,常见于 RGB 颜色(#FFFFFF 就是三个通道都取满)和单字节的最大值。八进制的 755 是 Linux 文件权限写法,三位分别对应属主、同组、其他用户的读写执行位,展开就是 rwxr-xr-x。二进制则常用于看清标志位掩码,例如把 6 展开成 110,一眼就能看出被置位的是哪两位。

计算分组的其它工具