进制转换
位翻转:点击下方位格 toggle · 同步显示其他进制 · 位宽切换 8/16/32/64
位运算(A op B)
输入字符串,显示每个字符的 ASCII / Unicode 码(DEC / HEX / OCT / BIN / UTF-8 字节)
输入十六进制颜色(#RGB / #RRGGBB / #RRGGBBAA),自动转 RGB / HSL / CMYK
2/8/10/16/任意进制/含负数/浮点
位翻转:点击下方位格 toggle · 同步显示其他进制 · 位宽切换 8/16/32/64
输入字符串,显示每个字符的 ASCII / Unicode 码(DEC / HEX / OCT / BIN / UTF-8 字节)
输入十六进制颜色(#RGB / #RRGGBB / #RRGGBBAA),自动转 RGB / HSL / CMYK
· 十进制 ↔ 十六进制:0-9 直对应,10-15 = A-F;255 = FF / 256 = 100 / 65535 = FFFF / 2³² = 100000000
· 二进制分组:默认 4 位一组(对应一个十六进制位),便于互转
· 补码(Two's Complement):表示有符号负数。如 8 位下 -1 = 11111111 = 0xFF / -128 = 10000000
· 前缀约定:0b 二进制 / 0o 八进制 / 0x 十六进制(C/Python/JS 通用)
· 36 进制:0-9 + A-Z 共 36 个符号,常用于短 ID 编码(如 8 位 36 进制 ≈ 2.8 万亿种组合)
了解工具定位 · 使用场景 · 对比优势
网络工程师配置子网时,需要将十进制 IP(192.168.1.0)转换为二进制(11000000.10101000.00000001.00000000)以手动计算子网掩码和广播地址。本工具支持 2/10 进制互转,同时处理 4 组 8 位二进制数,省去心算和逐位转换的繁琐,减少子网划分错误。
嵌入式开发者在调试寄存器或内存地址时,常遇到十六进制(0xFFA3)与十进制(65443)的混用需求。本工具支持负数与浮点数的进制转换,例如将 -128 的补码表示为 0xFF80,或验证浮点数 3.14 在 IEEE 754 单精度下的十六进制值,直接比对调试器输出。
UI 设计师从设计稿拿到十六进制颜色 #FF6600,但开发环境要求十进制 RGB 值(255,102,0)。本工具将 6 位 Hex 拆分为 R/G/B 三组转换,支持浮点透明度(如 #FF6600.80 对应 0.502),无需手动计算每两位十六进制对应的十进制,避免色值偏差。
安全工程师分析二进制协议数据包时,需要将抓包工具显示的十六进制字节流(如 0x4A 0x6F 0x68 0x6E)转换为 ASCII 字符串(John),或验证 CRC 校验值。本工具支持任意进制互转,可一次性转换整段十六进制序列,并保留浮点数精度,用于校验数值型字段的编码正确性。
计算机基础课教师在讲解原码、反码、补码时,需要演示 -5 的二进制表示(原码 10000101 → 补码 11111011)。本工具支持负数直接转换,并显示浮点数的 IEEE 754 二进制结构,学生输入任意整数或小数即可即时看到各进制结果,辅助理解补码运算和浮点精度损失原理。
| 维度 | 本工具 | 竞品 A (rapidtables.com) | 传统方法 |
|---|---|---|---|
| 数据隐私 | 纯浏览器端计算,输入数据不上传服务器 | 输入数据通过 HTTP 发送至服务器处理 | 依赖人工计算或本地安装的软件(如计算器) |
| 处理速度 | 毫秒级,输入即出结果 | 受网络延迟影响,约 1-3 秒 | 数秒至数分钟,取决于数字长度和人工熟练度 |
| 离线可用 | 完全离线,无需网络连接 | 必须联网 | 完全离线 |
| 支持的进制范围 | 2 至 36 进制(含任意进制) | 2、8、10、16 进制(固定选项) | 取决于使用的工具(如 Windows 计算器仅支持 2/8/10/16) |
| 负数与浮点支持 | 支持负数、浮点数(如 -A.BC) | 不支持负数,浮点数支持有限 | 人工计算可处理,但易出错 |
| 平台依赖 | 任何现代浏览器(PC/手机/平板) | 任何现代浏览器 | 需专用软件(如科学计算器)或纸笔 |
| 收费与注册 | 免费,无需注册 | 免费,无注册要求 | 免费(人工)或需购买软件 |
上手步骤 · 输入输出 · 避坑提示
| 输入 | 输出 | 说明 |
|---|---|---|
| 255 | 2: 11111111 8: 377 10: 255 16: FF | 典型场景:十进制 255 的常用进制转换 |
| 1010 | 2: 1111110010 8: 1762 10: 1010 16: 3F2 | 典型场景:二进制 1010 自动识别为十进制 |
| -42 | 2: -101010 8: -52 10: -42 16: -2A | 边界 case:负整数在二进制中带负号前缀 |
| 3.14 | 2: 11.001000111101011100001010001111010111000010100011111 8: 3.107534121727024 10: 3.14 16: 3.23D70A3D70A3D | 边界 case:浮点数转换,二进制无限循环 |
| 0 | 2: 0 8: 0 10: 0 16: 0 | 边界 case:零值在所有进制下均为 0 |
| FF | 2: 11111111 8: 377 10: 255 16: FF | 易错 case:十六进制 FF 自动识别为十六进制 |
| 0x1A | 2: 11010 8: 32 10: 26 16: 1A | 易错 case:支持 0x 前缀的十六进制格式 |
| 123.456 | 2: 1111011.011101001011110001101010011111101111100111011 8: 173.351232763767 10: 123.456 16: 7B.74BC6A7EF9DB | 典型场景:含小数的十进制数转换 |
−10-10Unicode 减号(U+2212)与 ASCII 连字符-减号(U+002D)不同;工具解析器只识别标准 ASCII 负号,粘贴 Word 或网页中的减号会导致解析失败
3,141593.14159欧洲国家习惯用逗号做小数点分隔符,但编程语言和本工具统一使用英文句点;输入逗号会被当作非法字符
1010 110110101101二进制只接受 0 和 1;空格、字母、标点都会触发校验错误。若需分组阅读,建议在输入框外自行加空格
0xFFFF0x 是编程语言中的字面量前缀,本工具直接处理纯数字字符串;输入 0x 会被当作非法字符 x 导致转换失败
在 3 进制下输入 5在 3 进制下只输入 0,1,2任意进制模式下,每位数字必须小于基数(0 到 base-1);输入大于等于基数的数字会被标记为非法
输入 0.1(十进制)→ 二进制结果 0.0001100110011001...(无限循环)理解 IEEE 754 浮点表示法下 0.1 无法精确存储0.1 在二进制中是无限循环小数,工具只能截断到有限位(通常 52 位尾数);这不是 bug,而是浮点数标准的固有特性
输入 3.14 但期望得到 11.001001...确认工具支持浮点模式,或手动拆分为整数部分 3 和小数部分 0.14 分别转换部分进制转换工具只处理整数,本工具支持浮点;若误用仅整数模式,小数部分会被直接丢弃
输入十进制 255,期望输出二进制 11111111,但看到的是 FF(十六进制)转换前检查目标进制下拉框是否选对了(2 进制、8 进制、10 进制、16 进制或自定义)工具默认保留上次使用的目标进制;若上次转换后未重置,输出进制可能与预期不同
公式推导 · 流程图解 · 依据出处
N = \sum_{i=0}^{n-1} d_i \times b^i
N — 十进制数值b — 目标进制(2 ≤ b ≤ 36)d_i — 第 i 位的数字(0 ≤ d_i < b)n — 整数部分的总位数将二进制 1101.01 转为十进制。整数部分:1×2³ + 1×2² + 0×2¹ + 1×2⁰ = 8+4+0+1=13。小数部分:0×2⁻¹ + 1×2⁻² = 0+0.25=0.25。结果:13.25。
适用于任意进制(2~36)整数与浮点数的正向转换。负数通过符号位单独处理,不改变公式结构。不适用于非标准进制(如负进制、混合进制)。
3 种主流语言 · 复制即用
import math
def convert_base(num_str: str, from_base: int, to_base: int) -> str:
"""任意进制转换,支持负数和小数"""
if from_base < 2 or to_base < 2:
raise ValueError("进制必须 >= 2")
negative = num_str.startswith('-')
if negative:
num_str = num_str[1:]
# 分离整数和小数部分
parts = num_str.split('.')
int_part = parts[0]
frac_part = parts[1] if len(parts) > 1 else ''
# 转十进制整数
decimal_int = int(int_part, from_base) if int_part else 0
# 转十进制小数
decimal_frac = 0.0
if frac_part:
for i, digit in enumerate(frac_part):
decimal_frac += int(digit, from_base) * (from_base ** -(i + 1))
# 十进制整数转目标进制
if decimal_int == 0:
result_int = '0'
else:
digits = []
n = abs(decimal_int)
while n > 0:
digits.append('0123456789ABCDEF'[n % to_base])
n //= to_base
result_int = ''.join(reversed(digits))
# 十进制小数转目标进制(精度 10 位)
result_frac = ''
if decimal_frac > 0:
f = decimal_frac
for _ in range(10):
f *= to_base
digit = int(f)
result_frac += '0123456789ABCDEF'[digit]
f -= digit
if f == 0:
break
result = ('-' if negative else '') + result_int
if result_frac:
result += '.' + result_frac
return result
# 示例:十进制 255.5 → 十六进制
print(convert_base('255.5', 10, 16)) # FF.8
# 示例:二进制 -1010.11 → 八进制
print(convert_base('-1010.11', 2, 8)) # -12.6package main
import (
"fmt"
"math/big"
"strings"
)
// ConvertBase 任意进制转换,支持负数和小数
func ConvertBase(numStr string, fromBase, toBase int) (string, error) {
if fromBase < 2 || toBase < 2 {
return "", fmt.Errorf("进制必须 >= 2")
}
negative := strings.HasPrefix(numStr, "-")
if negative {
numStr = numStr[1:]
}
// 分离整数和小数
parts := strings.Split(numStr, ".")
intPart := parts[0]
fracPart := ""
if len(parts) > 1 {
fracPart = parts[1]
}
// 解析整数部分
intVal := new(big.Int)
intVal.SetString(intPart, fromBase)
// 解析小数部分
fracVal := new(big.Rat)
if fracPart != "" {
fracNum := new(big.Int)
fracNum.SetString(fracPart, fromBase)
fracDen := new(big.Int).Exp(big.NewInt(int64(fromBase)), big.NewInt(int64(len(fracPart))), nil)
fracVal.SetFrac(fracNum, fracDen)
}
// 整数转目标进制
resultInt := intVal.Text(toBase)
// 小数转目标进制(精度 10 位)
resultFrac := ""
if fracVal.Num().BitLen() > 0 {
f := new(big.Rat).Set(fracVal)
for i := 0; i < 10; i++ {
f.Mul(f, big.NewRat(int64(toBase), 1))
num, _ := f.Float64()
digit := int(num)
resultFrac += fmt.Sprintf("%X", digit)
f.Sub(f, big.NewRat(int64(digit), 1))
if f.Num().BitLen() == 0 {
break
}
}
}
result := ""
if negative {
result = "-"
}
result += resultInt
if resultFrac != "" {
result += "." + resultFrac
}
return result, nil
}
func main() {
// 示例:十进制 255.5 → 十六进制
result, _ := ConvertBase("255.5", 10, 16)
fmt.Println(result) // FF.8
// 示例:二进制 -1010.11 → 八进制
result, _ = ConvertBase("-1010.11", 2, 8)
fmt.Println(result) // -12.6
}/**
* 任意进制转换,支持负数和小数
* @param {string} numStr - 输入数字字符串
* @param {number} fromBase - 原进制 (2-36)
* @param {number} toBase - 目标进制 (2-36)
* @returns {string} 转换结果
*/
function convertBase(numStr, fromBase, toBase) {
if (fromBase < 2 || toBase < 2) {
throw new Error('进制必须 >= 2');
}
const negative = numStr.startsWith('-');
if (negative) numStr = numStr.slice(1);
// 分离整数和小数
const [intPart, fracPart = ''] = numStr.split('.');
// 整数部分转换
const decimalInt = parseInt(intPart, fromBase);
const resultInt = decimalInt.toString(toBase).toUpperCase();
// 小数部分转换
let resultFrac = '';
if (fracPart) {
// 将小数部分转为十进制
let decimalFrac = 0;
for (let i = 0; i < fracPart.length; i++) {
decimalFrac += parseInt(fracPart[i], fromBase) * Math.pow(fromBase, -(i + 1));
}
// 十进制小数转目标进制(精度 10 位)
let f = decimalFrac;
for (let i = 0; i < 10; i++) {
f *= toBase;
const digit = Math.floor(f);
resultFrac += digit.toString(toBase).toUpperCase();
f -= digit;
if (f === 0) break;
}
}
let result = (negative ? '-' : '') + resultInt;
if (resultFrac) result += '.' + resultFrac;
return result;
}
// 示例:十进制 255.5 → 十六进制
console.log(convertBase('255.5', 10, 16)); // FF.8
// 示例:二进制 -1010.11 → 八进制
console.log(convertBase('-1010.11', 2, 8)); // -12.610 个高频疑问