PS:数据传输大多以 bit 为单位,比如我们常说的网速100M/s,M/s其实Mbit/s,也就是兆比特每秒,我们还可以写成100Mbps。
数制也叫进制/进位制,是人们规定的一种进位方法。对于任何一种进制 —— X 进制,就表示某一位置上的数运算时是逢 X 进一位。比如,十进制是逢十进一,十六进制是逢十六进一,二进制就是逢二进一,以此类推,x 进制就是逢 x 进位。
进位制 | 二进制 | 八进制 | 十进制 | 十六进制 |
---|---|---|---|---|
进位规则 | 逢二进一 | 逢八进一 | 逢十进一 | 逢十六进一 |
基数 | 2 | 8 | 10 | 16 |
数码 | 0,1 | 0,1…7 | 0,1…9 | 0,1…9,A…F |
位权 | 2^i | 8^i | 10^i | 16^i |
前缀 | 0b | 0o | 无 | 0x |
后缀 | B | O | D | H |
例如,16进制数101可以表示为101H、(101)下标16,或者0x101。
PS:八进制和十六进制之间不能直接转换,八进制需要先转成二进制或十进制,在由对应的二进制或十进制转成十六进制,反过来也一样。
数字编码在深入理解计算机系统cp2:定点数的表示和运算中再进行详细介绍。
用四位二进制数来表示一位十进制数,称为二–十进制编码,简称 BCD(Binary Coded Decimal)码。
BCD 码其实是为了处理十进制转化为二进制的问题而存在的。 前面我们介绍了二进制与十进制之间的转换,但这种转换对计算密集型应用友好,对输入/输出密集型应用则不友好 —— 因此设计了 BCD码。拿 8421BCD码 举例,它将 0~9 一一映射为一个四位二进制数,从而做到快捷转换。比如, 321 的 8421BCD码 直接就是 0011 0010 0001,而无需再想之前那样乘2取余的麻烦运算。
BCD码有很多,比如 8421BCD码,余三码等,这里我们只讲第一种。具体的对应关系如下:
注意:8421BCD码 只有 0000~1001 共十个,而 1010、1011…等等不是8421BCD码。
/ˈæski/
,即 American Standard Code for Information Interchange,美国信息交换标准代码。本来一个字节有8位,每一位有0和1两种状态,则一个字节共有2^8=256种状态,可以表示256种字符。但是美国佬比较自私,觉得只要可以表示自己的字母和一些特殊字符就足够了,所以 ASCII 没有占用最高位(而是固定为0),实际只用到了后面7位,它可以表示 2^7=128 种状态,也就是表示128个字符。
2) 很显然,这用来表示字母是足够的,但要想表示其它语言的字符,128还是太少了。
PS:附送 ASCII 对照表一张:
U+[16进制数]
。例如,大写字母 A 编码为 U+0041
,汉字“严”编码为 U+4E25
。
2) 问题:Unicode 一般用2个字节(也就是16位)表示一个字符,这在表示 ASCII 字符的时候会出现问题。我们知道,ASCII 字符实际只需要一个字节就够了,并且最高位甚至都还不需要用到,但是 Unicode 又规定表示一个字符至少需要2个字节,那么一个 ASCII 字符前面就必须要补0以满足这个规则,例如字母 A 就需要用 00000000 01000001
表示,这些多余的0是一个极大的资源浪费。也可以看下面这张图:
以汉字“严”为例,演示如何实现 UTF-8 编码。
“严”的 Unicode 是 U+4E25
(二进制数 100111000100101),据表,U+4E25
处在第三行的范围内(U+0800
~ U+FFFF
),因此“严”的UTF-8 编码需要三个字节,即格式 1110xxxx 10xxxxxx 10xxxxxx
。然后,从“严”的最后一个二进制位开始,依次从后向前填入格式中的 x,多出的位补 0。这样就得到 UTF-8 编码(二进制)是 11100100 10111000 10100101
,转换成十六进制就是 E4B8A5
。
参考: https://segmentfault.com/a/1190000005936800 https://www.liaoxuefeng.com/wiki/1016959663602400/1017075323632896