进制运算实战

相关概念

要素定义举例(十进制)
数位数字符号在数中所处的位置数字5在百位、十位、个位
基数该进制允许使用的数字符号个数十进制基数为10
位权某一位上的1所表示的实际数值大小百位的权是10²=100

基本特征

进制基数数字符号进位规则
二进制(B)20, 1逢二进一
八进制(O/Q)80~7逢八进一
十进制(D)100~9逢十进一
十六进制(H)160~9, A(10), B(11), C(12), D(13), E(14), F(15)逢十六进一

进制转换

其他进制->十进制方法:将每位数字乘以该位的位权,再求和。

  • 整数部分(从右往左,第i位权为 基数ⁱ⁻¹)
  • 小数部分(从左往右,第j位权为 基数⁻ʲ)

十进制->其他进制方法

  • 整数部分:除基取余,逆序排列
  • 小数部分:乘基取整,顺序排列

二进制<->八进制/十六进制方法:分组转换

转换类型方法规则
二转八三位一组从小数点开始,整数部分向左每3位一组,小数部分向右每3位一组,不足补0
八转二一位拆三位每位八进制数拆成3位二进制
二转十六四位一组从小数点开始,整数部分向左每4位一组,小数部分向右每4位一组,不足补0
十六转二一位拆四位每位十六进制数拆成4位二进制

八进制/十六进制<->十进制方法:与二进制类似,基数从2换成8或16

表示方法

进制前缀示例十进制值
十进制100100
八进制007561
十六进制0x 或 0X0x6096
二进制(C++14起)0b 或 0B0b101010

C++应用

#include <iostream>
#include <iomanip>
using namespace std;
int main() {
    cout << oct << 35 << endl;   // 输出八进制:43
    cout << dec << 35 << endl;   // 输出十进制:35
    cout << hex << 35 << endl;   // 输出十六进制:23
    cout << bitset<8>(35) << endl;  // 输出二进制:00100011
    return 0;
}

易错点

  1. 八进制数字范围是0~7,不会出现8或9——判断题高频陷阱
  2. 二进制转八进制/十六进制时,整数部分从右向左分组,小数部分从左向右分组,不足要补0
  3. C++中八进制以0开头,不是0o0O(Python才是)——客观题干扰项
  4. 十六进制A~F不区分大小写,但C++代码中通常用大写
  5. 负数的进制转换不在三级范围内,三级只考察正整数——注意题目限定条件
  6. 二进制小数转十进制时,2⁻¹=0.5,2⁻²=0.25,2⁻³=0.125——需熟练掌握小数位权