Skip to content

计算机科学入门

二进制

无论是电子管计算机还是晶体管计算机,我们可以发现,虽然数据有很多种形式,但是电路只有两种: 有电和没电 。因此发现其实用两个数字就可以表达所有的情况,这就是 二进制 (Binary)。和十进制不同的是,二进制只有两个数字: 0 和 1 ,十进制是逢十进一,而二进制是 逢二进一

早期的计算机还有三进制(Ternary),甚至是五进制(Quinary),但是多种的状态受到干扰时产生的错误就会越多,而只用“开”和“关”两种状态可以尽可能减少这类问题。

在数字数据存储器、存储、处理和通信中, 0 和 1 值有时分别称为“”和“”。

image-20231005132713934

为什么使用二进制

  1. 技术上容易实现。用双稳态电路表示二进制数字0和1是很容易的事情。
  2. 可靠性高。二进制中只使用0和1两个数字,传输和处理时不易出错。
  3. 二进制数与十进制数之间的转换相当容易。
  4. 有一整个数学分支存在,专门处理"真"和"假",它已经解决了所有法则和运算,叫 "布尔代数" (Boolean Algebra)。

阅读二进制

阅读二进制就是将二进制转换成我们熟悉的十进制。

在十进制中最大的数字是 9 ,再加 1 就会进位变成 10 。同理,在二进制中最大的数字是 1 ,再加 1 就会变成 10 。看起来都是数字 1 和 0 ,但是表达的意思却不同,在十进制中 10 表示数字十,而在二进制中 10 是 1+1 得来的所以 10 表示数字 2 。

让我们继续……

10 再加 1 会变成 11 ,这时是数字 3 。

11 再加 1 ,这时要进位变成 100 ,这时是数字 4 。

……

让我们列出最高位是 1 ,而其余都是 0 的情况:

100000001000000100000100001000100101
1286432168421

我们可以发现当最高位是 1 ,而其余都是 0 时,所表示的十进制正是 2 的 n 次方。

100000001000000100000100001000100101
2^72^62^52^42^32^22^12^0

二进制转换为十进制

二进制转换为十进制的技巧我称为 1248

当然后面还有很多,只需要将前一位乘 2 即可:16 、32、64、128、256、512、1024、2048……

例如二进制 1010111011 ,这个是我乱打的,接下来让我们用 1248 法将它转换为十进制。

  1. 将二进制所有的数字拆出来。
1010111011
  1. 写出对应的1248。
1010111011
5122561286432168421
  1. 将对应是 1 的 1248 相加。即 512+128+32+16+8+2+1=699 ,因此二进制 1010111011 所表示的十进制数为 699 。

十进制转换为二进制

这个方法叫做:除二取余法。

如果你有一个十进制数 13 。

  1. 除 2 ,结果为 6 余 1 。
  2. 取出结果 6 。
  3. 除 2 ,结果为 3 余 0 。
  4. 取出结果 3 。
  5. 除 2 ,结果为 1 余 1 。
  6. 取出结果 1 。
  7. 除 2 ,结果为 0 余 1 。
  8. 当结果为 0 时结束
  9. 将所有的结果从下到上拼凑。
  10. 因此 13 的二进制数为 1101 。

更大的数字也可以用这个方法。

二进制和计算机

字节

每个二进制数字都简称为bit,也叫位,一位只能用于表示 2 个不同的值:0 和 1。

一开始的时候,需要显示的字符只有 26 个英文字母、 10 个数字、计算符号以及各种特殊符号,这样大概 100 个字符需要显示。我们知道2的 7 次方是 128 ,为了制造更多的冗余因此再加 1 位,这时人们规定了一个字符用 8 个二进制数表示。

我们给他一个名字: 字节(byte)。

1 字节 = 8 位

1 bytes = 8 bits

也就是说, 26 个英文字母最少需要 1 个字节表示,但中文不同,一个汉字需要 2 个字节表示,我们再给它一个名字: (word)。

至于汉字怎么表示,我们可以查看《信息交换用汉字编码字符集》,**GB2312 **标准共收录6763个汉字,基本满足了日常生活需要,但是一些罕见字就打不出来,因此后来出现了 GBK

进制

就像 1 千克 = 1000 克一样,字节也有它的进制关系。与重量单位不同的是,存储单位换算率为1024。

1024B1KB
1024KB1MB
1024MB1GB
1024GB1TB
1024TB1PB

WARNING

b 和 B 不是一个东西, b 代表 bits , B 代表 Byte, 1Bytes = 8bits。

K、M、G、T、P这类前缀的命名有一套规则,叫做 《国际单位制词头》,所有的单位都会按照这个命名。

乘数因子中文名称符号英文
10^30昆[它]Qquetta
10^27容[那]Rronna
10^24尧[它]Yyotta
10^21泽[它]Zzetta
10^18艾[可萨]Eexa
10^15拍[它]Ppeta
10^12太[拉]Ttera
10^9吉[咖]Ggiga
10^6Mmega
10^3kkilo
10^2hhecto
10^1dadeca
10^-1ddeci
10^-2ccenti
10^-3mmilli
10^-6μmicro
10^-9纳[诺]nnano
10^-12皮[可]ppico
10^-15飞[母托]ffemto
10^-18阿[托]aatto
10^-21仄[普托]zzepto
10^-24幺[科托]yyocto
10^-27柔[托]rronto
10^-30亏[科托]qquecto

所以什么时候才可以买到 1 鲲的硬盘呢?

32/64位

现在使用的计算机一定是这两种的其中之一,位是指电脑CPU一次处理的最大的数据量,所谓32位处理器就是一次只能处理 32 位,也就是 4 个字节的数据,而64位处理器一次就能处理 64 位,即 8 个字节的数据。

图片颜色

你或许看到过图片分为 8 位, 16 位, 32 位。这代表了图片最大支持的颜色数量, 8 位含有 256 种颜色 16 位包含65000种颜色 32 位包含 4294967296 种颜色。

image-20231005143349327

正数和负数

大部分计算机用第一位二进制位表示正负: 0 为正,1 为负

因此在 32 位系统中只有 31 位表示数字内容,也就是能表示的数字范围是 -2147483648到2147483648 ,这是个非常经典的数字。

小数

因为小数点可以在数字间“浮动”,因此也叫浮点数

最常见的标准是 IEEE 754 标准,它用类似科学计数法的方法,来存十进制值。

IEEE 754规定了四种表示浮点数值的方式:单精确度(32位)、双精确度(64位)、延伸单精确度(43比特以上,很少使用)与延伸双精确度(79比特以上,通常以80位实现)

其中单精度和双精度在编程中非常常见。

标准的IEEE 754格式由三部分组成,符号位Sign,指数项exponent,以及尾数部分mantissa。一个浮点数 (Value) 的表示其实可以这样表示:

Value=sign×exponent×mantissaimage-20231005144759315

ASCII

American Standard Code for Information Interchange,美国信息交换标准代码,简称ASCII

ASCII 是 7 位代码,足够存 128 个不同值,其中包括了大小写英文字母、标点符号、特殊符号……

因为 ASCII 是个很早的标准,所以它被广泛使用,让不同公司制作的计算机,能互相交换数据,这种通用交换信息的能力叫 "互操作性" (interoperability)。

但是其他国家有不一样的字符,如:俄罗斯、希腊……于是他们使用了127位之后的位置。

Bin(二进制)Oct(八进制)Dec(十进制)Hex(十六进制)缩写/字符解释
0000 00000000x00NUL(null)空字符
0000 00010110x01SOH(start of headline)标题开始
0000 00100220x02STX (start of text)正文开始
0000 00110330x03ETX (end of text)正文结束
0000 01000440x04EOT (end of transmission)传输结束
0000 01010550x05ENQ (enquiry)请求
0000 01100660x06ACK (acknowledge)收到通知
0000 01110770x07BEL (bell)响铃
0000 100001080x08BS (backspace)退格
0000 100101190x09HT (horizontal tab)水平制表符
0000 1010012100x0ALF (NL line feed, new line)换行键
0000 1011013110x0BVT (vertical tab)垂直制表符
0000 1100014120x0CFF (NP form feed, new page)换页键
0000 1101015130x0DCR (carriage return)回车键
0000 1110016140x0ESO (shift out)不用切换
0000 1111017150x0FSI (shift in)启用切换
0001 0000020160x10DLE (data link escape)数据链路转义
0001 0001021170x11DC1 (device control 1)设备控制1
0001 0010022180x12DC2 (device control 2)设备控制2
0001 0011023190x13DC3 (device control 3)设备控制3
0001 0100024200x14DC4 (device control 4)设备控制4
0001 0101025210x15NAK (negative acknowledge)拒绝接收
0001 0110026220x16SYN (synchronous idle)同步空闲
0001 0111027230x17ETB (end of trans. block)结束传输块
0001 1000030240x18CAN (cancel)取消
0001 1001031250x19EM (end of medium)媒介结束
0001 1010032260x1ASUB (substitute)代替
0001 1011033270x1BESC (escape)换码(溢出)
0001 1100034280x1CFS (file separator)文件分隔符
0001 1101035290x1DGS (group separator)分组符
0001 1110036300x1ERS (record separator)记录分隔符
0001 1111037310x1FUS (unit separator)单元分隔符
0010 0000040320x20(space)空格
0010 0001041330x21!叹号
0010 0010042340x22"双引号
0010 0011043350x23#井号
0010 0100044360x24$美元符
0010 0101045370x25%百分号
0010 0110046380x26&和号
0010 0111047390x27'闭单引号
0010 1000050400x28(开括号
0010 1001051410x29)闭括号
0010 1010052420x2A*星号
0010 1011053430x2B+加号
0010 1100054440x2C,逗号
0010 1101055450x2D-减号/破折号
0010 1110056460x2E.句号
0010 1111057470x2F/斜杠
0011 0000060480x300字符0
0011 0001061490x311字符1
0011 0010062500x322字符2
0011 0011063510x333字符3
0011 0100064520x344字符4
0011 0101065530x355字符5
0011 0110066540x366字符6
0011 0111067550x377字符7
0011 1000070560x388字符8
0011 1001071570x399字符9
0011 1010072580x3A:冒号
0011 1011073590x3B;分号
0011 1100074600x3C<小于
0011 1101075610x3D=等号
0011 1110076620x3E>大于
0011 1111077630x3F?问号
0100 00000100640x40@电子邮件符号
0100 00010101650x41A大写字母A
0100 00100102660x42B大写字母B
0100 00110103670x43C大写字母C
0100 01000104680x44D大写字母D
0100 01010105690x45E大写字母E
0100 01100106700x46F大写字母F
0100 01110107710x47G大写字母G
0100 10000110720x48H大写字母H
0100 10010111730x49I大写字母I
010010100112740x4AJ大写字母J
0100 10110113750x4BK大写字母K
0100 11000114760x4CL大写字母L
0100 11010115770x4DM大写字母M
0100 11100116780x4EN大写字母N
0100 11110117790x4FO大写字母O
0101 00000120800x50P大写字母P
0101 00010121810x51Q大写字母Q
0101 00100122820x52R大写字母R
0101 00110123830x53S大写字母S
0101 01000124840x54T大写字母T
0101 01010125850x55U大写字母U
0101 01100126860x56V大写字母V
0101 01110127870x57W大写字母W
0101 10000130880x58X大写字母X
0101 10010131890x59Y大写字母Y
0101 10100132900x5AZ大写字母Z
0101 10110133910x5B[开方括号
0101 11000134920x5C\反斜杠
0101 11010135930x5D]闭方括号
0101 11100136940x5E^脱字符
0101 11110137950x5F_下划线
0110 00000140960x60`开单引号
0110 00010141970x61a小写字母a
0110 00100142980x62b小写字母b
0110 00110143990x63c小写字母c
0110 010001441000x64d小写字母d
0110 010101451010x65e小写字母e
0110 011001461020x66f小写字母f
0110 011101471030x67g小写字母g
0110 100001501040x68h小写字母h
0110 100101511050x69i小写字母i
0110 101001521060x6Aj小写字母j
0110 101101531070x6Bk小写字母k
0110 110001541080x6Cl小写字母l
0110 110101551090x6Dm小写字母m
0110 111001561100x6En小写字母n
0110 111101571110x6Fo小写字母o
0111 000001601120x70p小写字母p
0111 000101611130x71q小写字母q
0111 001001621140x72r小写字母r
0111 001101631150x73s小写字母s
0111 010001641160x74t小写字母t
0111 010101651170x75u小写字母u
0111 011001661180x76v小写字母v
0111 011101671190x77w小写字母w
0111 100001701200x78x小写字母x
0111 100101711210x79y小写字母y
0111 101001721220x7Az小写字母z
0111 101101731230x7B{开花括号
0111 110001741240x7C|垂线
0111 110101751250x7D}闭花括号
0111 111001761260x7E~波浪号
0111 111101771270x7FDEL (delete)删除

Unicode

ASCII最多只能表示200多个字符,大部分国家都够用了,但是少数国家还是不够用,比如中国就推出了GB2312,这其中共收录6763个汉字。

但这出现了一个问题:如果使用了错误的字符集就会出现乱码

这时候Unicode就诞生了,如果把各种文字编码形容为各地的方言,那么统一码就是世界各国合作开发的一种语言。

目前Unicode字符分为17组,每组称为一个平面(Plane),每个平面拥有16位,也就是65536个点位,一共可以包含100多万个字符。这其中不仅包括了所有国家的语言字符,还包括了数学符号、特殊字符,甚至是 Emoji 😀。

Unicode的实现

Unicode 字符集的编码范围是 0x0000 - 0x10FFFF , 可以容纳一百多万个字符, 每个字符都有一个独一无二的编码,也即每个字符都有一个二进制数值和它对应,这里的二进制数值也叫 码点

Unicode 是一个符号集, 它只规定了每个符号的二进制值,但是符号具体如何存储它并没有规定。

常见的实现方式是UTF(Unicode Transformation Format),如:UTF-8、UTF-16、UTF-32。其中UTF-8 最常见。后面的数字表明至少使用多少个比特位来存储字符,如:UTF-8 最少需要8bits也就是一个字节来存储,对应的, UTF-16 和 UTF-32 分别需要最少 2 个字节 和 4 个字节来存储。

UTF-8

Universal Multiple-Octet Coded Character Set,简称为UCS ,UCS-2表示一个字符用2个字节表示,UCS-4表示一个字符用4个字节表示。但一些字符并不需要这么多的字节表示,都使用Unicode会造成浪费,于是出现了 可变长度的储存方式。

最常见的储存方式是UTF-8,它可以用来表示Unicode标准中的任何字符,其规则如下:

  1. 对于单字节的符号,字节的第一位设为 0,后面 7 位为这个符号的 Unicode 码。因此对于英语字母,UTF-8 编码和 ASCII 码是相同的, 所以 UTF-8 能兼容 ASCII 编码

  2. 对于 n 字节的符号( n > 1),第一个字节的前 n 位都设为 1,第 n + 1 位设为 0,后面字节的前两位一律设为 10 。剩下的没有提及的二进制位,全部为这个符号的 Unicode 码。

Unicode编码对应UTF-8需要的字节数量:

Unicode符号范围UTF-8所需字节数量
0000 0000 - 0000 007F1
0000 0080 - 0000 07FF2
0000 0800 - 0000 FFFF3
0001 0000 - 0010 FFFF4

US-ASCIl字符只需1字节。

带有变音符号的拉丁文、希腊文、西里尔字母、亚美尼亚语、希伯来文、阿拉伯文、叙利亚文等字母使用2字节。

中日韩文字、东南亚文字、中东文字等使用3字节。

其他极少使用的语言字符使用4字节。

示例
image-20231005154824477
  1. 中文均使用 3 字节,因此使用 1110 开头。
  2. 使用三字节则分成三份。
  3. 填入Unicode的二进制表示。

用心去做高质量的编程学习内容网站,欢迎star ⭐让更多人发现!