位权展开与除基取余
任意进制数都可以按位权展开成十进制:第 n 位(从 0 开始)的数值乘以基数的 n 次方再求和。反方向(十进制转其他进制)用除基取余法,把余数从后往前读。两种方法都是纯数学操作,不需要记忆对照表;工程上真正容易出错的不是算法,而是前缀、前导零与有符号解释这些表示层约定。
基本信息
| 常用基数 | 二进制 2、八进制 8、十进制 10、十六进制 16 |
|---|---|
| 常见前缀 | 0b 二进制、0o 或前导 0 八进制、0x 十六进制;前缀并非所有工具都接受 |
| 数字字符 | 基数大于 10 时用 a 到 z 补足,大小写一般不敏感,上限通常为 36 |
| 负数 | 二进制层面多用补码表示,最高位为符号位;十六进制写全宽时也按同一位宽解释 |
| 验证手段 | 转过去再转回来做往返校验,并检查位宽是否满足字节边界 |
典型使用场景
- 读懂权限位、标志位与寄存器值,这些通常以八进制或十六进制给出
- 处理颜色、内存地址、协议字段等十六进制常量
- 写脚本做批量转换,避免手工算错
- 排查「数值对不上」:确认是进制问题还是位宽、符号问题
- 给二进制数据做位对齐,需要同时关心进制与字节数
命令行与脚本做法
命令行与脚本做法
printf '%d\n' 0x1f # 十六进制转十进制:31
printf '%x\n' 255 # 十进制转十六进制:ff
printf '%o\n' 8 # 十进制转八进制:10
echo 'obase=16; 255' | bc # 用 bc 交互式转换
python3 -c "print(int('1010',2), hex(42), bin(255))" # 各进制互转
python3 -c "print(format(255,'08b'), format(255,'#010x'))" # 补零与带前缀方法与适用场景
| 场景 | 方法 | 注意 |
|---|---|---|
| 其他进制转十进制 | 按位权展开求和 | 注意最高位权重与位宽无关 |
| 十进制转其他进制 | 除基取余,余数倒序 | 负数先取绝对值再补符号 |
| 同为 2 的幂进制互转 | 按位分组:八进制 3 位一组,十六进制 4 位一组 | 分组要从最低位开始,高位不足补零 |
| 解析字符串 | 显式指定基数,不要依赖自动推断 | 前导零可能被当成八进制 |
| 验证结果 | 往返转换比对 | 同时校验位宽与大小写形式 |
小数的进制转换与整数不同:十进制 0.1 无法用有限位二进制精确表示,转换会无限循环下去。做金额或精度敏感的计算时用十进制类型或分数类型,不要用浮点数反复转进制。
八进制是事故高发区:不少语言与工具把前导 0 当作八进制标记,010 不是 10 而是 8。解析外部数据时始终显式声明基数,写数值常量时避免无意义的前导零(以官方文档为准)。