跳转到内容

计算机进制

在计算机中存储和信息处理使用的都是二进制表示。

什么是二进制呢?就是逢2进1,每个数只能小于2,即都是由0、1组成。与我们人常用的十进制,逢10进1是一样的方式。

那为什么在计算机中使用二进制来表示呢?

有如下几个原因:

  1. 计算机的底层电子元件(如晶体管)本质上只能区分两种状态导通(1)和截止(0),对应电压的高与低且在物理上更易实现且稳定,因为区分两种状态比区分多个状态(如十进制的10种)更抗干扰,减少了因噪声或微小电压波动导致的错误。

  2. 二进制直接对应布尔代数中的真(True/1)与假(False/0),而计算机的核心逻辑门电路(如与门、或门、非门)正是基于布尔代数设计的。这使得二进制能无缝衔接硬件逻辑与数学运算,简化了电路设计。

  3. 运算与存储的高效性

  • 计算简化:二进制运算规则简单(如加法仅需处理进位),可通过位移和逻辑门快速完成。例如,乘法通过位移和加法即可实现,而十进制需要更复杂的步骤。
  • 存储密度:每个存储单元(如内存、硬盘)只需保持两种状态,降低了物理实现的复杂度与成本,同时提高了可靠性。

十六进制

在计算机中最小的存储单位是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个二进制数构成,所以非常方便用二进制表示。

下面为二进制、十进制、十六进制表格对应关系如下:

二进制十进制十六进制
000000
000111
001022
001133
010044
010155
011066
011177
100088
100199
101010a
101111b
110012c
110113d
111014e
111115f

二进制与十六进制的转换

将十六进制的数,例:0x173A4C十六进制数转换为二进制,可以将十六进制的每位数转换为对应的二进制数,一个十六进制数用4个二进制数表示,查看对照上面的表,即很容易得到答案。

十六进制数二进制数
10001
70111
30011
A1010
40100
C1100

即对应的二进制为:000101110011101001001100

反过来,也可以很容易将二机制转换为十六进制,但是需要注意 将二进制转换为十六进制时,需要从最低位开始每4位算一个二进制数,如果最高位少于4,前面则用0来补足

例如:将二进制转化为十六进制1111001010110110110011

二进制数十六进制数
00113
1011b
1101d
1010a
1100c
00113

将2的n次幂快速转换为十六进制,核心原理是:

  1. 二进制特性:2的n次幂在二进制中表示为1后跟n个0。
  2. 十六进制分组:每4位二进制对应1位十六进制(如 0000 → 0x0, 1111 → 0xF)。

转换步骤:

  1. 将n分解为商和余数

    将n表示为 n=4q+r,其中q 是商(整数),r是余数(0 ≤ r ≤ 3)。

  2. 确定前导数字

    根据余数r,前导十六进制数字为 1<<r(即 $\ce{2^r}$)

    • r=0 → 0x1
    • r=1 → 0x2
    • r=2 → 0x4
    • r=3 → 0x8
  3. 添加后缀零

    在末尾添加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直到不能除为止。

  1. 反复除以2

用十进制数不断除以2,记录每次的余数(0或1)。

  1. 倒序排列余数

最后一次运算的余数为二进制最高位,第一次运算的余数为最低位。

例如:十进制 18 → 二进制

18 ÷ 2 = 9 余 0
9 ÷ 2 = 4 余 1
4 ÷ 2 = 2 余 0
2 ÷ 2 = 1 余 0
1 ÷ 2 = 0 余 1
余数倒序排列 → 10010 → 二进制为 10010

十进制转换为十六进制

除16取余法,一个十进制数一直除16直到不能除为止。

  • 反复除以16

    用十进制数不断除以16,记录每次的余数。

  • 余数处理

    余数 <10 → 直接记录数字(0-9)。

    余数 ≥10 → 转换为字母(A=10, B=11, …, F=15)。

  • 倒序排列余数

    最后一次运算的余数为最高位,第一次运算的余数为最低位。

例如:十进制36 → 十六进制

315 ÷ 16 = 19 余 11 → B
19 ÷ 16 = 1 余 3 → 3
1 ÷ 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² = 256
A → 10 × 16¹ = 160
3 → 3 × 16⁰ = 3
总和:256 + 160 + 3 = 419 → 十进制为 419