Featured image of post FoCS 02 - 进制

FoCS 02 - 进制

逢 N 进一

封面故事:人类制造的第一块集成电路

# 位置化数字系统

在位置化数字系统中,数字的值由 各个数字符号的值 和 各个数字符号所处的位置 共同决定。

# 进制

进制也就是进位计数制,是人为定义的带进位的计数方法,进制是一种位置化数字系统。
对于任何一种进制,比如 N 进制,就表示每一位上的数运算时都是逢 N 进一位。 十进制 是逢十进一,16 进制是逢 16 进一,二进制 就是逢二进一,以此类推。

因此 N 进制中每位上能出现的数字符号集为 {0, 1, 2, 3,..., N-1},我们也称 N 为 底数

K 位 N 进制的最大值为 N^K - 1

# 十进制

十进制是我们日常生活中最常见的进制,十进制中能出现的数字符号包括:0-9,共 10 个

对于任意十进制数字,如 1938.5-224.2

1
2
3
4
5
1938.5 = 1 * 10^3 + 9 * 10^2 + 3 * 10^1 + 8 * 10^0 + 5 * 10^(-1)
       = 1000 + 900 + 30 + 8 + 0.5

-224.2 = (-2) * 10^2 + (-2) * 10^1 + (-4) * 10^0 + (-2) * 10^(-1)
       = (-200) + (-20) + (-4) + (-0.2)

K 位的十进制数最大能表示的数为 10^K -1

# 二进制

二进制是计算机中最常见的进制

为什么计算机不像人类一样使用十进制呢?

因为电子器件大多具有两种稳定状态,比如晶体管的导通和截止,电压的高和低,磁性的有和无等。这样可以简化计算机的物理设计并提升稳定性。(因此并不是所有计算机都是二进制 的)

对于任意的二进制数字,如 1011.1-110.1

1
2
3
4
5
1011.1 = 1 * 2^3 + 0 * 2^2 + 1 * 2^1 + 2 * 2^0 + 1 * 2^(-1)
       = 1000 + 10 + 1 + 0.1

-110.1 = (-1) * 2^2 + (-1) * 2^1 + 0 * 2^0 + (-1) * 2^(-1)
       = (-100) + (-10) + (-0.1)

K 位的二进制数能表示的最大数为 2^K - 1

# 16 进制

如你所见,二进制表示一个比较大的数字时会导致数字过长
但十进制不像二进制那样能直接显示存储在计算机中,而且也和二进制数字之间没有显然的关系,转换也不算便捷

8 进制(简称 Oct) 和 16 进制 (简称 Hex) 是用于解决上述问题的,这里先谈更常用的 16 进制。

为了和表明一个数字是 16 进制,我们会使用 0x 开头,比如:

1
2
0x123456
0x6AF

其字符集包含:{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F}
在 16 进制 中,字母字符与数字的对应关系如下:

1
2
3
4
5
6
A ----> 10
B ----> 11
C ----> 12
D ----> 13
E ----> 14
F ----> 15

对于任意 16 进制数,如 0x2D.F:

1
2
0x2D.F = 2 * 16^1 + D * 16^0 + F * 16^(-1)
注意:尽管 16 进制 可以用于表示小数,但是并不常见

K 位的 16 进制 数能表示的最大数为 16^K - 1

# 八进制

为了表明一个数字是 八进制,我们会使用 0 开头,比如:

1
2
01234
02234

其字符集包含:{0, 1, 2, 3, 4, 5, 6, 7}

对于任意八进制数,如 023.7:

1
2
023.7 = 2 * 8^1 + 3 * 8^0 + 7 * 8^(-1)
注意:尽管 16 进制可以用于表示小数,但是并不常见

K 位的八进制数能表示的最大数为 8^K - 1

# 进制转换

# 其他进制转换到十进制

将各位上的数转换为对应的十进制,然后相加即可

# 二进制转十进制

比如数字 110.11

1
2
3
110.11 = 1 * 2^2 + 1 * 2^1 + 0 * 2^0 + 1 * 2^(-1) + 1 * 2^(-2)
       = 4       + 2       + 0       + 0.5        + 0.25
       = 6.75       

# 16 进制转十进制

比如数字 0x2AF.CB:

1
2
3
0x2AF.CB = 2 * 16^2 + A * 16^1 + F * 16^0 + C * 16^(-1) + B * 16^(-2)
         = 2 * 16^2 + 10 * 16  + 15 * 1   + 12 * 0.0628 + 11 * 0.00390625
         = 687.79656875

由此可见,使用 16 进制表示小数非常不便

# 八进制转十进制

比如数字 0163.5

1
2
3
0163.5 = 1 * 8^2 + 6 * 8^1 + 3 * 8^0 + 5 * 8^(-1)
       = 64      + 48      + 3       + 0.625
       = 115.625

由此可见,使用八进制表示小数也非常不便

# 十进制转换到其他进制

将十进制转换为其他进制的运算分为 整数部分 和 小数部分

  • 整数部分:使用连除法,除以底数,直到商为0,将所得余数逆序排列即可得到结果
  • 小数部分:使用连乘法,乘以底数,结果的小数部分继续参与运算,直到小数部分全为0,整数部分顺序排列得到结果

# 十进制转二进制

将数字 17.625 化为二进制

整数部分:

1
2
3
4
5
6
7
8
                余数    备注
17 / 2 = 8      1
8 / 2 = 4       0
4 / 2 = 2       0
2 / 2 = 1       0
1 / 2 = 0       1       此时商为 0,停止运算

将余数倒序排列(从下到上)可得:10001

小数部分:

1
2
3
4
5
6
                    整数部分   备注
0.625 * 2 = 1.25    1         1.25 的小数部分为 0.25
0.25 * 2 = 0.5      0         0.5 的小数部分为 0.5
0.5 * 2 = 1         1         1 的小数部分为 0,停止运算

将整数部分顺序排列(从上到下)可得:101

合计:10001.101

# 十进制转 16 进制

将数字 17.625 化为 16 进制

整数部分:

1
2
3
4
5
                余数    备注
17 / 16 = 1     1       
1 / 16 = 0      1       此时商为 0,停止运算   

将余数倒序排列(从下到上)可得:11

小数部分:

1
2
3
4
                    整数部分   备注
0.625 * 16 = 10     A         10 的小数部分为 0,停止运算

将余数倒序排列(从下到上)可得:A

合计:0x11.A

# 十进制转八进制

将数字 17.625 化为 八进制

整数部分:

1
2
3
4
5
                余数    备注
17 / 8 = 2      1       
2 / 16 = 0      2       此时商为 0,停止运算   

将余数倒序排列(从下到上)可得:21

小数部分:

1
2
3
4
                    整数部分   备注
0.625 * 8 = 5       5          5 的小数部分为 0,停止运算

将余数倒序排列(从下到上)可得:5 

合计:021.5

# 二进制和 16 进制互转

# 二进制 转 16 进制

转化过程也分为整数部分和小数部分:

  • 整数部分:从小数点左侧第一位开始,每 4 位(因为 16 = 2^4)化作一个 16 进制数
  • 小数部分:从小数点右侧第一位开始,每 4 位(因为 16 = 2^4)化作一个 16 进制数

如 二进制数 100001001110.110101

整数部分:

1
2
1000 0100 1110
8    4    E   

小数部分:

1
2
1101 0100
D    4

合计:0x84E.D4

# 16 进制转二进制

和上面的过程相反,将每一位 16 进制数转换为二进制即可还原

如 16 进制数 2FA.DE

1
2
2       F       A       .       D       E
0010    1111    1010    .       1101    1110

合计:1011111010.1101111

# 转换所需的最小位数

如果一个十进制整数 X 转换为 N 进制,转换后需要最少多少位表示?

一个长度为 n 的 N 进制整数能表示的最大数为 N^n - 1
因此如果存在 N^(n-1) - 1 < X <= N^n - 1,则说明 X 转换为 N 进制后最少需要 n 位数字表示

比如:对于十进制整数 144 转化为二进制, 有 2^7 - 1 < 144 < 2^8 - 1127 < 144 < 255
所以 144 转化为二进制最少需要 8 位来表示

comments powered by Disqus
Hosted by Cloudflare
使用 Hugo 构建
主题 StackJimmy 设计