考纲要求
- 理解每种进制的基数和位权,例如二进制第 k 位的位权是 2 的 k 次方,k 从 0 开始。
- 掌握任意进制转十进制的方法:各位数字乘以对应位权后求和。
- 掌握十进制转任意进制的方法:除基数取余,把余数倒序排列。
- 记住二、八、十六进制之间的快速对应:每 3 位二进制对应 1 位八进制,每 4 位对应 1 位十六进制。
典型题型
- 给出二进制或十六进制数,要求转成十进制。
- 给出十进制数,要求转成二进制或十六进制。
- 在二进制、八进制、十六进制之间直接转换。
常见错误
- 把位权从 1 开始算,导致整体结果差一倍。最右边一位是 2 的 0 次方,值为 1。
- 十进制转二进制时把余数按正序写出,忘了倒序。
- 十六进制中出现大于 9 的位时把它当十进制数字计算,忘记 A 到 F 分别代表 10 到 15。
- 二进制转八进制时分组方向正确,但左侧不足 3 位时补零补到了右边。
深入理解
两个方向,两套固定动作
十进制转其他进制:除基取余,逆序排列。以 45 转二进制为例:45 ÷ 2 余 1、22 余 0、11 余 1、5 余 1、2 余 0、1 余 1,从下往上读得 101101。每一步的除数都是目标进制,余数从后往前排,顺序写反是最高频的错误。
其他进制转十进制:按权展开求和。二进制 101101 从右往左的位权是 1、2、4、8、16、32,把位上是 1 的权加起来:32 + 8 + 4 + 1 = 45。十六进制同理,位权是 16 的幂,权值要乘以该位上的数字(A 到 F 分别是 10 到 15)。
二进制和八、十六进制是「分组」关系
因为 8 = 2³、16 = 2⁴,二进制转八进制只要从右往左每 3 位一组,转十六进制每 4 位一组,组内直接查表。最高位不足一组时在左边补零,而不是右边——补错边是另一个高频错误。
例如 101101 转八进制:分成 101 和 101,即 5 和 5,结果是 55;转十六进制:分成 0010 和 1101,即 2 和 D,结果是 2D。反过来由八进制或十六进制转二进制,把每一位展开成 3 位或 4 位即可,前导零可以省略。
C++ 里怎么写不同进制的常量
十进制直接写,例如 45;八进制加前导 0,例如 055 表示十进制的 45;十六进制加 0x,例如 0x2D;C++14 起支持二进制前缀 0b,例如 0b101101。这四种写法在程序里是同一个值,只在字面量层面不同。
输出时默认用十进制。要输出其他进制,可以用 oct、hex、bitset。需要特别小心八进制前导 0:写 int a = 010; 得到的是 8 而不是 10,这是打印调试时最迷惑的现象之一。
自编例题
同一个数的三种写法
把二进制 101101 分别转成十进制和十六进制。
int n = 0b101101; // C++14 支持二进制字面量
cout << n << endl; // 45
cout << hex << n << endl; // 2d按权展开:1 乘 32 加 0 乘 16 加 1 乘 8 加 1 乘 4 加 0 乘 2 加 1 乘 1 等于 45,所以十进制是 45。把 101101 从右往左每 4 位一组,得到 0010 与 1101,分别对应十六进制的 2 和 D,合起来是 0x2D。反过来,45 除以 16 商 2 余 13,13 写作 D;2 除以 16 商 0 余 2,把余数倒序读出就是 2D。
相关真题
这块内容在整条路线里的位置:GESP C++ 3 级备考路径。
READY TO START
开始练习
先做一套本级别测评,报告会指出哪些知识点需要重点补;再回到本页对照考纲要求逐条核对,把不确定的条目记下来集中练。
常见问题
为什么计算机使用二进制?
二进制只有 0 和 1,容易用电路的通断两种状态表示,抗干扰强,运算规则也最简单。
为什么十六进制很常见?
4 位二进制正好对应 1 位十六进制,书写比二进制短得多,又能直接对应内存中的位模式,便于阅读和调试。
负数的进制转换怎么处理?
先确定采用几位表示,再转换成补码形式,然后按位分组或按权展开。不能直接对绝对值做转换。
