封面故事:人类制造的第一块集成电路
位置化数字系统
在位置化数字系统中,数字的值由 各个数字符号的值 和 各个数字符号所处的位置 共同决定。
进制
进制也就是进位计数制,是人为定义的带进位的计数方法,进制是一种位置化数字系统。
对于任何一种进制,比如 N 进制,就表示每一位上的数运算时都是逢 N 进一位。 十进制 是逢十进一,16 进制是逢 16 进一,二进制 就是逢二进一,以此类推。
因此 N 进制中每位上能出现的数字符号集为 {0, 1, 2, 3,..., N-1}
,我们也称 N 为 底数
K 位 N 进制的最大值为 N^K - 1
十进制
十进制是我们日常生活中最常见的进制,十进制中能出现的数字符号包括:0-9,共 10 个
对于任意十进制数字,如 1938.5
和 -224.2
:
|
|
K 位的十进制数最大能表示的数为 10^K -1
二进制
二进制是计算机中最常见的进制
为什么计算机不像人类一样使用十进制呢?
因为电子器件大多具有两种稳定状态,比如晶体管的导通和截止,电压的高和低,磁性的有和无等。这样可以简化计算机的物理设计并提升稳定性。(因此并不是所有计算机都是二进制 的)
对于任意的二进制数字,如 1011.1
和 -110.1
|
|
K 位的二进制数能表示的最大数为 2^K - 1
16 进制
如你所见,二进制表示一个比较大的数字时会导致数字过长
但十进制不像二进制那样能直接显示存储在计算机中,而且也和二进制数字之间没有显然的关系,转换也不算便捷
8 进制(简称 Oct) 和 16 进制 (简称 Hex) 是用于解决上述问题的,这里先谈更常用的 16 进制。
为了和表明一个数字是 16 进制,我们会使用 0x
开头,比如:
|
|
其字符集包含:{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F}
在 16 进制 中,字母字符与数字的对应关系如下:
|
|
对于任意 16 进制数,如 0x2D.F
:
|
|
K 位的 16 进制 数能表示的最大数为 16^K - 1
八进制
为了表明一个数字是 八进制,我们会使用 0
开头,比如:
|
|
其字符集包含:{0, 1, 2, 3, 4, 5, 6, 7}
对于任意八进制数,如 023.7
:
|
|
K 位的八进制数能表示的最大数为 8^K - 1
进制转换
其他进制转换到十进制
将各位上的数转换为对应的十进制,然后相加即可
二进制转十进制
比如数字 110.11
:
|
|
16 进制转十进制
比如数字 0x2AF.CB
:
|
|
由此可见,使用 16 进制表示小数非常不便
八进制转十进制
比如数字 0163.5
|
|
由此可见,使用八进制表示小数也非常不便
十进制转换到其他进制
将十进制转换为其他进制的运算分为 整数部分 和 小数部分
- 整数部分:使用连除法,除以底数,直到商为0,将所得余数逆序排列即可得到结果
- 小数部分:使用连乘法,乘以底数,结果的小数部分继续参与运算,直到小数部分全为0,整数部分顺序排列得到结果
十进制转二进制
将数字 17.625
化为二进制
整数部分:
|
|
小数部分:
|
|
合计:10001.101
十进制转 16 进制
将数字 17.625
化为 16 进制
整数部分:
|
|
小数部分:
|
|
合计:0x11.A
十进制转八进制
将数字 17.625
化为 八进制
整数部分:
|
|
小数部分:
|
|
合计:021.5
二进制和 16 进制互转
二进制 转 16 进制
转化过程也分为整数部分和小数部分:
- 整数部分:从小数点左侧第一位开始,每 4 位(因为 16 = 2^4)化作一个 16 进制数
- 小数部分:从小数点右侧第一位开始,每 4 位(因为 16 = 2^4)化作一个 16 进制数
如 二进制数 100001001110.110101
整数部分:
|
|
小数部分:
|
|
合计:0x84E.D4
16 进制转二进制
和上面的过程相反,将每一位 16 进制数转换为二进制即可还原
如 16 进制数 2FA.DE
|
|
合计: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 - 1
即 127 < 144 < 255
所以 144 转化为二进制最少需要 8 位来表示