计算机进制
在计算机中存储和信息处理使用的都是二进制表示。
什么是二进制呢?就是逢2进1,每个数只能小于2,即都是由0、1组成。与我们人常用的十进制,逢10进1是一样的方式。
那为什么在计算机中使用二进制来表示呢?
有如下几个原因:
-
计算机的底层电子元件(如晶体管)本质上只能区分两种状态导通(1)和截止(0),对应电压的高与低且在物理上更易实现且稳定,因为区分两种状态比区分多个状态(如十进制的10种)更抗干扰,减少了因噪声或微小电压波动导致的错误。
-
二进制直接对应布尔代数中的真(True/1)与假(False/0),而计算机的核心逻辑门电路(如与门、或门、非门)正是基于布尔代数设计的。这使得二进制能无缝衔接硬件逻辑与数学运算,简化了电路设计。
-
运算与存储的高效性
- 计算简化:二进制运算规则简单(如加法仅需处理进位),可通过位移和逻辑门快速完成。例如,乘法通过位移和加法即可实现,而十进制需要更复杂的步骤。
- 存储密度:每个存储单元(如内存、硬盘)只需保持两种状态,降低了物理实现的复杂度与成本,同时提高了可靠性。
十六进制
在计算机中最小的存储单位是bit(比特),1字节 = 8bit,即:1字节需要用8位二进制来表示。
1字节二进制的表示范围为:00000000 ~ 11111111
1字节十进制的表示范围为:0 ~ 255
这2种描述字节范围不太方便,二进制表示太冗长,十机制与bit的转换机制非常麻烦,在计算机中使用十六机制来表示,十六进制简写为(hex),即由(0~15数字组成,满16进1)。
用a表示10、b表示11、c表示12、d表示13、e表示14、f表示15。
一个十六进制数用4个二进制数构成,所以非常方便用二进制表示。
下面为二进制、十进制、十六进制表格对应关系如下:
| 二进制 | 十进制 | 十六进制 |
|---|---|---|
| 0000 | 0 | 0 |
| 0001 | 1 | 1 |
| 0010 | 2 | 2 |
| 0011 | 3 | 3 |
| 0100 | 4 | 4 |
| 0101 | 5 | 5 |
| 0110 | 6 | 6 |
| 0111 | 7 | 7 |
| 1000 | 8 | 8 |
| 1001 | 9 | 9 |
| 1010 | 10 | a |
| 1011 | 11 | b |
| 1100 | 12 | c |
| 1101 | 13 | d |
| 1110 | 14 | e |
| 1111 | 15 | f |
二进制与十六进制的转换
将十六进制的数,例:0x173A4C十六进制数转换为二进制,可以将十六进制的每位数转换为对应的二进制数,一个十六进制数用4个二进制数表示,查看对照上面的表,即很容易得到答案。
| 十六进制数 | 二进制数 |
|---|---|
| 1 | 0001 |
| 7 | 0111 |
| 3 | 0011 |
| A | 1010 |
| 4 | 0100 |
| C | 1100 |
即对应的二进制为:000101110011101001001100
反过来,也可以很容易将二机制转换为十六进制,但是需要注意 将二进制转换为十六进制时,需要从最低位开始每4位算一个二进制数,如果最高位少于4,前面则用0来补足
例如:将二进制转化为十六进制1111001010110110110011。
| 二进制数 | 十六进制数 |
|---|---|
| 0011 | 3 |
| 1011 | b |
| 1101 | d |
| 1010 | a |
| 1100 | c |
| 0011 | 3 |
将2的n次幂快速转换为十六进制,核心原理是:
- 二进制特性:2的n次幂在二进制中表示为1后跟n个0。
- 十六进制分组:每4位二进制对应1位十六进制(如 0000 → 0x0, 1111 → 0xF)。
转换步骤:
-
将n分解为商和余数
将n表示为 n=4q+r,其中q 是商(整数),r是余数(0 ≤ r ≤ 3)。
-
确定前导数字
根据余数r,前导十六进制数字为 1<<r(即 $\ce{2^r}$)
- r=0 → 0x1
- r=1 → 0x2
- r=2 → 0x4
- r=3 → 0x8
-
添加后缀零
在末尾添加q个十六进制的0(每个0对应4位二进制)。
例如:
-
n=5
5=4×1+1 → 前导0x2,加1个0 → 0x20。
-
n=10
10=4×2+2 → 前导0x4,加2个0 → 0x400。
-
n=16
16=4×4+0 → 前导0x1,加4个0 → 0x10000。
低进制转换为高进制
例如:二进制转换为十进制,十进制转换为十六进制
二进制转换为十进制
基础转换方式
二进制每位的权值为 $\ce{2^n}$(从右到左,最低位为$\ce{2^0}$),转换的本质是按权展开求和。
十进制值=$\ce{b_0}$ * $\ce{2^0}$ + $\ce{b_1}$ * $\ce{2^1}$ + … + $\ce{b_n}$ * $\ce{2^n}$
逐步累加法(从左到右)
- 从二进制最高位开始,初始结果为 0。
- 每读一位,将当前结果 乘以 2,然后 加上该位的值(0 或 1)。
- 重复直到最低位。
例如:(二进制 101101 → 十进制)
初始值: 0第1位(1): 0×2 +1 = 1第2位(0): 1×2 +0 = 2第3位(1): 2×2 +1 = 5第4位(1): 5×2 +1 = 11第5位(0): 11×2 +0 = 22第6位(1): 22×2 +1 = 45→ 结果为 45十进制转换为二进制
除2取余法,一个十进制数一直除2直到不能除为止。
- 反复除以2
用十进制数不断除以2,记录每次的余数(0或1)。
- 倒序排列余数
最后一次运算的余数为二进制最高位,第一次运算的余数为最低位。
例如:十进制 18 → 二进制
18 ÷ 2 = 9 余 09 ÷ 2 = 4 余 14 ÷ 2 = 2 余 02 ÷ 2 = 1 余 01 ÷ 2 = 0 余 1余数倒序排列 → 10010 → 二进制为 10010十进制转换为十六进制
除16取余法,一个十进制数一直除16直到不能除为止。
-
反复除以16
用十进制数不断除以16,记录每次的余数。
-
余数处理
余数 <10 → 直接记录数字(0-9)。
余数 ≥10 → 转换为字母(A=10, B=11, …, F=15)。
-
倒序排列余数
最后一次运算的余数为最高位,第一次运算的余数为最低位。
例如:十进制36 → 十六进制
315 ÷ 16 = 19 余 11 → B19 ÷ 16 = 1 余 3 → 31 ÷ 16 = 0 余 1 → 1余数倒序排列 → 1 3 B → 0x13B也可以先将十进制转换为二进制,通过二进制能快速转换为十六进制。
十六进制转换为二进制
使用权值展开法,即每位十六进制数乘以16然后求和。
-
确定每位权值
十六进制数从右到左,每位权值为$\ce{16^n}$(最低位n=0,依次递增)
-
转换字母为数值
将字母 A-F 转为对应的十进制值(A=10, B=11, …, F=15)。
-
逐位计算并求和
每位数值 x$\ce{16^n}$将所有结果相加。
例如:十六进制 0x1A3 → 十进制
分解:1 → 1 × 16² = 256A → 10 × 16¹ = 1603 → 3 × 16⁰ = 3总和:256 + 160 + 3 = 419 → 十进制为 419