完善:完善《软件设计师知识点速记》
This commit is contained in:
@@ -17,16 +17,25 @@ tags:
|
||||
|
||||
#### R 进制 => 十进制
|
||||
|
||||
R 进制转十进制使用 **按权展开法** ,其具体操作方式为:将 R 进制数的每一位数值用 $R^{k}$ 形式表示,即幂的底数是 R,指数为 k,k 与该位和小数点之间的距离有关。当该位位于小数点左边,k 值是该位和小数点之间数码的个数,而当该位位于小数点右边,k 值是负值,其绝对值是该位和小数点之间数码的个数加 1。
|
||||
R 进制转十进制使用 **按权展开法** ,其具体操作方式为:将 R 进制数的每一位数值用 $R^k$ 形式表示,即幂的底数是 R,指数为 k,k 与该位和小数点之间的距离有关。当该位位于小数点左边,k 值是该位和小数点之间数码的个数,而当该位位于小数点右边,k 值是负值,其绝对值是该位和小数点之间数码的个数加 1。
|
||||
|
||||
**示例:二进制数 10100.01 转换为十进制。**
|
||||
**示例:二进制数 10100.01 转换为十进制数。**
|
||||
|
||||
**解析:** 示例中的二进制数存在小数点位,可先计算小数点位一侧的数值。我们从左侧开始,,从小数点位左侧第 1 位数值开始计数:0、1、2、3、4,一共 5 位数值,则第 5 位数值 1 可以展开为 $1*2^{4}$ ,第 4 位数值 0 可以展开为 $0*2^{3}$(由于 0 和任何数相乘结果都为 0,以后日常转换时,可以直接跳过数值为 0 的计算,但注意只是跳过计算不是跳过计数),依次类推...。
|
||||
**解析:** 示例中的二进制数存在小数点位,这时候我们可以分开转换整数和小数部分,最后将转换结果相加即可。
|
||||
|
||||
左侧累加完后,再继续计算小数点位右侧,从小数点位右侧第 1 位数值开始计数,-1、-2,一共 2 位数值。不过按照我们日常的顺序习惯,可以直接从第 1 位数值展开计算,0 展开计算为 $0*2^{-1}$,第 2 位数值 1 展开计算为 $1*2^{-2}$,将结果最终累加求和即可得到对应二进制的十进制表示。
|
||||
首先,将整数部分 10100 转换为十进制数,方法是将每个二进制数位乘以 2 的幂次方,再将结果相加。
|
||||
$$
|
||||
10100B = 1 * 2^4 + 0 * 2^3 + 1 * 2^2 + 0 * 2^1 + 0 * 2^0 = 16 + 4 = 20D
|
||||
$$
|
||||
然后,将小数部分 0.01 转换为十进制数,方法是将每个二进制数位乘以 2 的负幂次方,再将结果相加。
|
||||
$$
|
||||
0.01B = 0 * 2^{-1} + 1 * 2^{-2} = 0 + 0.25 = 0.25D
|
||||
$$
|
||||
|
||||
最后,我们将整数部分和小数部分的结果相加即可。下方是整数部分和小数部分转换整合在一起的效果:
|
||||
|
||||
$$
|
||||
10100.01=1*2^{4}+0*2^{3}+1*2^{2}+0*2^{1}+0*2^{0}+0*2^{-1}+1*2^{-2}
|
||||
10100.01B = 1 * 2^4 + 0 * 2^3 + 1 * 2^2 + 0 * 2^1 + 0 * 2^0 + 0 * 2^{-1} + 1 * 2^{-2} = 20 + 0.25 = 20.25D
|
||||
$$
|
||||
|
||||
::: tip 笔者说
|
||||
@@ -34,10 +43,10 @@ $$
|
||||
**按权展开:** 即将 R 进制的每一权位数值(个位、十位、百位...)分别展开计算,最后求和。
|
||||
:::
|
||||
|
||||
::: details 例题:七进制数 604.01 转换为十进制。
|
||||
::: details 例题:七进制数 604.01 转换为十进制数。
|
||||
**解析:** 根据按权展开法,可得到下列表达式:
|
||||
$$
|
||||
604.01=6*7^{2}+0*7^{1}+4*7^{0}+0*7^{-1}+0*7^{-2}
|
||||
604.01 = 6 * 7^2 + 0 * 7^1 + 4 * 7^0 + 0 * 7^{-1} + 1 * 7^{-2} = 298 + 0.02 = 298.02D
|
||||
$$
|
||||
:::
|
||||
|
||||
@@ -45,7 +54,7 @@ $$
|
||||
|
||||
十进制转 R 进制使用 **短除法** ,简单来说就是将十进制数除 R 取余,余数为权位上的数,得到的商值继续除R,依此步骤继续向下运算直到商为 0 为止。然后从最后一个余数读到第一个即为我们转换的 R 进制。
|
||||
|
||||
**示例:十进制数 150 转换为二进制。**
|
||||
**示例:十进制数 150 转换为二进制数。**
|
||||
|
||||
**解析:**
|
||||
|
||||
@@ -53,49 +62,55 @@ $$
|
||||
|
||||
#### 二进制 => 八进制
|
||||
|
||||
3 位二进制数按权展开相加得到 1 位八进制数。
|
||||
每 3 位二进制数 **按权展开** 相加得到 1 位八进制数,二进制转成八进制是从右到左开始转换,不足位时补 0。
|
||||
|
||||
::: tip 笔者说
|
||||
3 位二进制转成八进制是从右到左开始转换,不足位时补 0。
|
||||
:::
|
||||
|
||||
**示例:二进制数 100101110 转换为八进制。**
|
||||
**示例:二进制数 100101110 转换为八进制数。**
|
||||
|
||||
**解析:**
|
||||
|
||||

|
||||
|
||||
**结果为:100101110B = 226O**
|
||||
|
||||
::: tip 笔者说
|
||||
为什么每位八进制数要用 3 位二进制数表示?
|
||||
这也很好理解,八进制数中 7 是每位最大值,如果用二进制表示的话就是 111。这不就是 3 位二进制数吗?
|
||||
$$
|
||||
1 * 2^2 + 1 * 2^1 + 1 * 2^0 = 7
|
||||
$$
|
||||
:::
|
||||
|
||||
#### 二进制 <= 八进制
|
||||
|
||||
二进制数转换为八进制,是用 3 位二进制数表示 1 位八进制数。反之八进制数转换为二进制数,那就需要用 1 位八进制数来表示 3 位二进制数。
|
||||
上方提到了,二进制数转换为八进制,是用 3 位二进制数表示 1 位八进制数。反之八进制数转换为二进制数,那就需要用 1 位八进制数来表示 3 位二进制数。
|
||||
|
||||
八进制数通过对每位数值进行短除法,得到二进制数,每个八进制数为 3 个二进制数,不足时在最左边补 0。
|
||||
八进制数通过对每位数值进行短除法,得到二进制数,每位八进制数为 3 位二进制数,不足时在最左边补 0。
|
||||
|
||||
**示例:八进制数 226 转换为二进制。**
|
||||
**示例:八进制数 226 转换为二进制数。**
|
||||
|
||||
**解析:**
|
||||
|
||||

|
||||
|
||||
**结果为:226O = 10010110B**
|
||||
|
||||
#### 二进制 => 十六进制
|
||||
|
||||
与二进制转八进制方法近似,八进制是取三合一,十六进制是取四合一。
|
||||
与二进制转八进制方法类似,转八进制是取三合一,转十六进制是取四合一。即每 4 位二进制数 **按权展开** 相加得到 1 位十六进制数。
|
||||
|
||||
::: tip 笔者说
|
||||
4 位二进制转成十六进制是从右到左开始转换,不足位时补0。
|
||||
:::
|
||||
|
||||
**示例:二进制数 100101110 转换为十六进制。**
|
||||
**示例:二进制数 100101110 转换为十六进制数。**
|
||||
|
||||
**解析:**
|
||||
|
||||

|
||||
|
||||
**结果为:100101110B = 12CH**
|
||||
|
||||
#### 二进制 <= 十六进制
|
||||
|
||||
二进制数转换为十六进制,是用 4 位二进制数表示 1 位十六进制数。反之十六进制数转换为二进制数,那就需要用 1 位十六进制数来表示 4 位二进制数。
|
||||
二进制数转换为十六进制数,是用 4 位二进制数表示 1 位十六进制数。反之十六进制数转换为二进制数,那就需要用 1 位十六进制数来表示 4 位二进制数。
|
||||
|
||||
十六进制数通过对每位数值进行短除法,得到二进制数,每个十六进制数为 4 个二进制数,不足时在最左边补 0。
|
||||
十六进制数通过对每位数值进行短除法,得到二进制数,每位十六进制数为 4 位二进制数,不足时在最左边补 0。
|
||||
|
||||
**示例:十六进制数 12C 转换为二进制。**
|
||||
|
||||
@@ -103,8 +118,16 @@ $$
|
||||
|
||||

|
||||
|
||||
**结果为:12CH = 100101100B**
|
||||
|
||||
::: tip 笔者说
|
||||
十六进制中,每位的最大值为 15,但如果用十进制的写法的话就占用了 2 位,所以十六进制中,使用 A 表示 10、B 表示 11、C 表示 12、D 表示 13、E 表示 14、F 表示 15。
|
||||
:::
|
||||
|
||||
### 码制的表示
|
||||
|
||||
在计算机中,数字通常以二进制形式表示,也就是由 0 和 1 组成的数字序列。为了方便计算机进行数学运算,计算机需要使用一些编码方式来表示数字,其中最常用的编码方式是原码、反码、补码和移码。
|
||||
|
||||
#### 码制运算
|
||||
|
||||
| | 数值1 | 数值-1 |
|
||||
@@ -114,17 +137,52 @@ $$
|
||||
| 补码 | 0000 0001 | 1111 1111 |
|
||||
| 移码 | 1000 0001 | 0111 1111 |
|
||||
|
||||
二进制数值,最高位(最左侧的数值)是符号位,0 表示正数,1 表示负数。
|
||||
- 原码:原码是最基本的编码方式,它的规则很简单:将数字的符号位(左侧第 1 位)和数值位(其余位)分开,符号位用 0 表示正数,用 1 表示负数,数值位则按照正常的二进制表示。例如:+5 的原码是 **0**0000101,-5 的原码是 **1**0000101。
|
||||
|
||||
- 原码:除符号位,其余低位表示数值的绝对值。
|
||||
- 反码:正数的反码与原码相同,负数的反码是其绝对值按位取反。
|
||||
- 补码:正数的补码与原码、反码相同,负数的补码是其反码末尾加 1。
|
||||
- 移码:补码的符号位按位取反。
|
||||
- 反码:反码是为了解决原码的符号位带来的问题而出现的。反码的规则是:正数的反码与原码相同,负数的反码是符号位不变,数值位按位取反。例如:+5 的反码还是 **0**0000101,-5 的反码是 **1**1111010。
|
||||
|
||||
> **取反:** 原来为 0 则变为 1,原来为 1 则变为 0。(真假变换)
|
||||
|
||||
- 补码:补码是为了解决反码的问题而出现的。补码的规则是:正数的补码与原码相同,负数的补码是它的反码加 1。例如,+5 的补码还是 **0**0000101,-5 的补码是 **1**1111011。
|
||||
|
||||
> 补码具有会溢出的特性,适合参与进行加减法运算。
|
||||
|
||||
- 移码:移码是将补码的符号位取反,其余位不变。例如,+5 的移码是 **1**0000101,-5 的移码是 **0**1111010。
|
||||
|
||||
|
||||
这些编码方式在计算机中都有广泛的应用,不同的编码方式有不同的优缺点,具体使用哪种编码方式取决于具体的应用场景。
|
||||
|
||||
::: tip 笔者说
|
||||
**取反:** 原来为 0 则变为 1,原来为 1 则变为 0。(真假变换)
|
||||
|
||||
在上方补码介绍中,提到了二进制数计算加 1 的问题,**1**1111010 + 1 = **1**1111011,这个很简单,但如果是 **1**1111011 + 1 呢?其实也很简单,注意的就是二进制每位最大值是 1,如果每位 > 1 也就是 2 的时候就要进 1 了(逢 2 进 1)。
|
||||
|
||||
```
|
||||
11111011 (原数)
|
||||
00000001 (加1)
|
||||
--------
|
||||
11111100 (结果)
|
||||
```
|
||||
|
||||
:::
|
||||
|
||||
#### 数值范围
|
||||
|
||||
| 码制 | 定点整数 | 定点小数 |
|
||||
| ---- | ------------------------------------ | ------------------------------------------- |
|
||||
| 原码 | $-(2^{n-1} -1) \sim + (2^{n-1} - 1)$ | $-(1 - 2^{-(n-1)}) \sim + (1 - 2^{-(n-1)})$ |
|
||||
| 反码 | $-(2^{n-1} -1) \sim + (2^{n-1} - 1)$ | $-(1 - 2^{-(n-1)}) \sim + (1 - 2^{-(n-1)})$ |
|
||||
| 补码 | $-2^{n-1} \sim + (2^{n-1} - 1)$ | $-1 \sim + (1 - 2^{-(n-1)})$ |
|
||||
| 移码 | $-2^{n-1} \sim + (2^{n-1} - 1)$ | $-1 \sim + (1 - 2^{-(n-1)})$ |
|
||||
|
||||
在一个字长为 n(8 位原码)的计算机中,原码可以表示的数值范围为:**1**1111111 ~ **0**1111111,将除符号位之外的数值位转换为十进制:
|
||||
$$
|
||||
1111111B = 1 * 2^6 + 1 * 2^5 + 1 * 2^4 + 1 * 2^3 + 1 * 2^2 + 1 * 2^1 + 1 * 2^0 = 127D
|
||||
$$
|
||||
即 8 位原码可表示的数值范围为:-127 ~ +127,推导得出 n 位原码可表示的数值范围是:
|
||||
$$
|
||||
-(2^{n-1} -1) \sim + (2^{n-1} - 1)
|
||||
$$
|
||||
|
||||
## 流水线技术
|
||||
|
||||
- 流水线建立时间:第 1 条指令执行时间
|
||||
|
Reference in New Issue
Block a user