day04 进制和编码

课程目标:讲解计算机中一些必备的常识知识,让大家了解一些常见名词背后的含义(重在理解,今天不写代码)。

课程概要:

  • python代码的运行方式
  • 进制
  • 计算机中的单位
  • 编码

1.Python代码运行方式

  • 脚本式

    将python代码写好之后保存在文件中,再用python解释器去运行该文件

    python3 -/PycharmProjects/day03/6.作业题讲解.py
    
  • 交互式

    在cmd中输入python3指令可进入python的交互式环境,一般用于在线代码测试,缺点是关闭后无法保存代码。

    python3
    

2.进制

计算机中底层所有的数据都是以 " 010101 " 的形式存在(图片、文本、视频等)。

  • 二进制(逢2进1)

    计算机识别二进制指令的方式可以类比成古代打仗点烽火台的方式(如下图):

    假设 " 1 " 代表点燃的烽火台," 0 " 代表未点燃的烽火台,那么根据图示," 110010 " 表示进攻," 010100 " 表示撤退," 100001 " 表示投降。其实计算机也是根据这样的方式来执行相关指令的。

  • 二进制、八进制(逢8进1)、十进制(逢10进1)、十六进制(逢16进1)之间的关系如下图:

    补充:其实不同进制之间只是表现形式不同,比如我们从小学习接触的都是十进制,所以我们对它非常熟悉,但对计算机来说二进制才是它执行指令的依据。

2.1 进制转换

二进制、八进制、十六进制都可以跟十进制相互转换,但是二进制、八进制、十六进制之间不能直接转换,要通过十进制进行转换。

  • 十进制转换为其他进制:
v1 = bin(25)    # 十进制转换为二进制
print(v1)       # "0b11001"v2 = oct(23)  # 十进制转换为八进制
print(v2)       # "0o27"v3 = hex(28)     # 十进制转换为十六进制
print(v3)       # "0x1c"
  • 其他进制转换为十进制:
# int()函数中传入参数base,可将其他进制转换为十进制
i1 = int( "0b11001" , base=2 )      # 二进制转换为十进制
print(i1)                         # 25i2 = int( "0o27" , base=8 )       # 八进制转换为十进制
print(i2)                         # 23i3 = int( "0x1c" , base=16 )      # 十六进制转换为十进制
print(i3)                         # 28

3. 计算机中的单位

由于计算机中本质上所有的东西以二进制进行存储和操作的,为了方便对于二进制值大小的表示,所以产生了一些计量单位。

  • b(bit),位

    1      # 1位/1b
    10      # 2位/2b
    111     # 3位/3b
    1001    # 4位/4b
    
  • B(byte),字节

    8位是一个字节:

    10010110           # 1字节/1B
    10010110 10010110    # 2字节/1B
    
  • KB(kilobyte),千字节

    1024个字节是1个千字节:

    10010110 11010110  10010111 ...        # 1千字节/1KB# 1KB = 1024B = 1024 * 8 b
    
  • M(Megabyte),兆

    1024个千字节是1兆:

    # 1M = 1024KB = 1024 * 1024 B = 1024 * 1024 * 8 b
    
  • G(Gigabyte),千兆

    1024兆是1千兆:

    # 1G = 1024M = 1024 * 1024 KB = 1024 * 1024 * 1024 B = 1024 * 1024 * 1024 * 8 b
    
  • T(Terabyte),万亿字节

    1024千兆是1万亿字节,即:1024G = 1T

  • …其他更大单位 PB/EB/ZB/YB/BB/NB/DB 换算关系不再赘述。

练习:

  • 假设1个汉字需要2个字节(2B=16位来表示,如:1000101011001100),那么1G流量可以通过网络传输多少汉字呢?(计算机传输本质上也是二进制)

    # 1G = 1024 M = 1024 * 1024 KB = 1024 * 1024 * 1024 B
    每个汉字需要2个字节表示,所以1G流量可以传输汉字数为:
    1024 * 1024 * 1024/2 = 536870912
    
  • 假设1个汉字需要2个字节(2B=16位来表示,如:1000101011001100),那么500G硬盘可以存储多少个汉字?

    # 500G = 500 * 1024 M = 500 * 1024 * 1024 KB = 500 * 1024 * 1024 * 1024 B
    每个汉字需要2个字节表示,所以500G流量可以传输汉字数为:
    500 * 1024 * 1024 * 1024 / 2 = 268435456000
    

4.编码

编码:是文字和二进制之间的对照表。

4.1 ascii 编码

ascii 编码是计算机创建之初发明的编码,规定使用1个字节(8位)来表示字母、字符与二进制的对应关系。

00000000
00000001
00000010
00000011
...
11111111# 1个字节(8位)共有 2**8=256 种不同的二进制组合,假设每种组合分别代表1种字母/字符,那么最多可表示256种字母/字符。



注意:ascii 编码中只能表示英文字母、数字和相关字符,不能表示中文。

4.2 gb-2312 编码

gb-2312编码,由国家信息标准委员会制作(1980年)。

gbk编码,对gb2312进行扩展,包含了中日韩等文字(1995年)。

为了向下兼容ascii码,gb-2312编码在与二进制做对应关系时,有如下逻辑:

  • 单字节表示,用一个字节表示对应关系。最多有 2**8=256 种组合可能性。
  • 双字节表示,用两个字节表示对应关系。最多有 2**16=65536 种组合可能性。

4.3 unicode

unicode也被称为万国码,为全球的每个文字都分配了一个码位(二进制表示)。有以下2套标准: