进位计数制与位权

在 RR 进制中:

  • 基数为 RR,每一位可使用 0∼R−10\sim R-1;
  • 计数规则是“逢 RR 进 1”;
  • 同一个数字处于不同位置时,表示的实际大小不同。

例如,十进制数 357357 可以写成:

357=3×102+5×101+7×100357=3\times 10^2+5\times 10^1+7\times 10^0

其中 102、101、10010^2、10^1、10^0 就是各位的位权。

对于一般的 RR 进制数:

(anan−1⋯a1a0.a−1a−2⋯ )R(a_na_{n-1}\cdots a_1a_0.a_{-1}a_{-2}\cdots)_R

其数值为:

anRn+an−1Rn−1+⋯+a0R0+a−1R−1+a−2R−2+⋯a_nR^n+a_{n-1}R^{n-1}+\cdots+a_0R^0+a_{-1}R^{-1}+a_{-2}R^{-2}+\cdots

重点: 小数点左边的指数从 00 开始向左递增;小数点右边的指数从 −1-1 开始向右递减。

常见进制

进制 英文名称 常见缩写 基数 可用数字 示例
二进制 binary bin 2 0、1 (101101)2(101101)_2
八进制 octal oct 8 0~7 (735)8(735)_8
十进制 decimal dec 10 0~9 (357)10(357)_{10}
十六进制 hexadecimal hex 16 0~9、A~F (2AF)16(2AF)_{16}

bin、oct、dec、hex 常用作进制名称的简写;具体编程语言中的数字前缀写法可能不同。

十六进制中:

A=10,B=11,C=12,D=13,E=14,F=15A=10,\quad B=11,\quad C=12,\quad D=13,\quad E=14,\quad F=15

下标用于标明数的进制。例如,(1011)2=1110(1011)_2=11_{10},但 (1011)10(1011)_{10} 仍表示十进制的一千零十一。

任意进制转换为十进制

方法是:按权展开,相加。

整数转换

例如,将 (2AF)16(2AF)_{16} 转换成十进制:

(2AF)16=2×162+10×161+15×160=512+160+15=68710\begin{aligned} (2AF)_{16} &=2\times16^2+10\times16^1+15\times16^0\\ &=512+160+15\\ &=687_{10} \end{aligned}

小数转换

例如,将 (101.101)2(101.101)_2 转换成十进制:

(101.101)2=1×22+0×21+1×20+1×2−1+0×2−2+1×2−3=4+1+12+18=5.62510\begin{aligned} (101.101)_2 &=1\times2^2+0\times2^1+1\times2^0\\ &\quad+1\times2^{-1}+0\times2^{-2}+1\times2^{-3}\\ &=4+1+\frac12+\frac18\\ &=5.625_{10} \end{aligned}

十进制转换为其他进制

整数部分和小数部分要分别处理:

部分 方法 数位排列顺序
整数部分 除基取余 余数逆序排列
小数部分 乘基取整 整数部分顺序排列

整数部分:除基取余,逆序排列

例如,将 451045_{10} 转换成二进制:

45÷2=22余 122÷2=11余 011÷2=5余 15÷2=2余 12÷2=1余 01÷2=0余 1\begin{array}{rcl} 45\div2&=&22\quad\text{余 }1\\ 22\div2&=&11\quad\text{余 }0\\ 11\div2&=&5\quad\text{余 }1\\ 5\div2&=&2\quad\text{余 }1\\ 2\div2&=&1\quad\text{余 }0\\ 1\div2&=&0\quad\text{余 }1 \end{array}

从下往上读取余数,可得:

4510=(101101)2\boxed{45_{10}=(101101)_2}

之所以要逆序,是因为第一次得到的余数对应最低位 202^0,之后才依次对应更高位。

转换为十六进制时,若余数大于 9,要改写为对应字母。例如:

687÷16=42余 15=F42÷16=2余 10=A2÷16=0余 2\begin{array}{rcl} 687\div16&=&42\quad\text{余 }15=F\\ 42\div16&=&2\quad\text{余 }10=A\\ 2\div16&=&0\quad\text{余 }2 \end{array}

因此:

68710=(2AF)16\boxed{687_{10}=(2AF)_{16}}

小数部分:乘基取整,顺序排列

例如,将 0.625100.625_{10} 转换成二进制:

0.625×2=1.25取 10.25×2=0.5取 00.5×2=1.0取 1\begin{array}{rcl} 0.625\times2&=&1.25\quad\text{取 }1\\ 0.25\times2&=&0.5\quad\text{取 }0\\ 0.5\times2&=&1.0\quad\text{取 }1 \end{array}

按出现顺序读取整数部分,可得:

0.62510=(0.101)2\boxed{0.625_{10}=(0.101)_2}

若小数部分不能在有限次运算后变为 00,就根据题目要求保留指定位数,并进行截断或舍入。

整数与小数混合

分别转换后再拼接。例如:

1310=(1101)2,0.62510=(0.101)213_{10}=(1101)_2,\qquad 0.625_{10}=(0.101)_2

所以:

13.62510=(1101.101)2\boxed{13.625_{10}=(1101.101)_2}

二、八、十六进制之间的快速转换

因为 8=238=2^3、16=2416=2^4,所以:

1 位八进制=3 位二进制\boxed{1\text{ 位八进制}=3\text{ 位二进制}} 1 位十六进制=4 位二进制\boxed{1\text{ 位十六进制}=4\text{ 位二进制}}

二进制与八进制

八进制 二进制 八进制 二进制
0 000 4 100
1 001 5 101
2 010 6 110
3 011 7 111

八进制转二进制时,将每一位改写为 3 位二进制:

(572)8=(101 111 010)2=(101111010)2(572)_8=(101\ 111\ 010)_2=(101111010)_2

二进制转八进制时,从小数点开始向两侧每 3 位分为一组。例如:

(11011)2=(011 011)2=(33)8(11011)_2=(011\ 011)_2=(33)_8

二进制与十六进制

十六进制 二进制 十六进制 二进制
0 0000 8 1000
1 0001 9 1001
2 0010 A 1010
3 0011 B 1011
4 0100 C 1100
5 0101 D 1101
6 0110 E 1110
7 0111 F 1111

十六进制转二进制时,将每一位改写为 4 位二进制:

(3AF)16=(0011 1010 1111)2=(1110101111)2(3AF)_{16}=(0011\ 1010\ 1111)_2=(1110101111)_2

二进制转十六进制时,每 4 位分为一组:

(1101011011)2=(0011 0101 1011)2=(35B)16(1101011011)_2=(0011\ 0101\ 1011)_2=(35B)_{16}

含小数点时的分组规则

以小数点为中心,分别向左、向右分组:

  • 整数部分最左侧不足一组时,在左边补 0;
  • 小数部分最右侧不足一组时,在右边补 0。

例如,将 (101101.1011)2(101101.1011)_2 转换成八进制:

(101 101.101 100)2=(55.54)8(101\ 101.101\ 100)_2=(55.54)_8

补零不会改变数值,例如 (011)2=(11)2(011)_2=(11)_2,(0.1)2=(0.100)2(0.1)_2=(0.100)_2。

八进制与十六进制

通常以二进制为桥梁:

八进制⟷二进制⟷十六进制\boxed{\text{八进制}\longleftrightarrow\text{二进制}\longleftrightarrow\text{十六进制}}

例如:

(735)8=(111 011 101)2=(0001 1101 1101)2=(1DD)16\begin{aligned} (735)_8 &=(111\ 011\ 101)_2\\ &=(0001\ 1101\ 1101)_2\\ &=(1DD)_{16} \end{aligned}

转换方法总结

转换类型 方法
任意进制 → 十进制 按权展开求和
十进制整数 → RR 进制 除 RR 取余,逆序排列
十进制小数 → RR 进制 乘 RR 取整,顺序排列
二进制 ↔ 八进制 3 位一组
二进制 ↔ 十六进制 4 位一组
八进制 ↔ 十六进制 借助二进制转换

易错点: 注意整数与小数的读取顺序相反;分组时,整数部分在左侧补 0,小数部分在右侧补 0;十六进制中大于 9 的数码要写成 A~F。