十进制
- 最常用的计数方式,几乎全世界都在使用
- 十进制就是满十进一的进制
- 按权展开,第一位权为10^0,第二位 10^1 ……以此类推,第N位10^(N-1)。该数的数值等于每位的数值*该位对应的权值之和。
十进制当中一共有10个数字,0 1 2 3 4 5 6 7 8 9,当9之后继续加1需要向前进一位开始循环,10 11 12 13 ... 20 21 22
二进制
- 计算机底层使用的计数方式
- 满二进一,二进制中一共存在两个数字:0和1
- 易于表现,实现简单,易于运算
二进制的产生
二进制是由德国哲学家、数学家莱布尼茨发明的。由于二进制只有0、1两个数字,所以可以很方便的在电路中表示:比如高电平用1表示、低电平用0表示。又比如开关的开用1表示、关用0表示,还可以表示逻辑的真假、是非等。就是因为其简便的方式所以在计算机的世界中也全都使用二进制来表示。图片、音乐、视频、文本文件等底层都是一串串的0和1组成的二进制。
例如上述图片的部分二进制表示如下:
十进制是逢9向高位进1。同样的二进制基数是2,因此是“逢二进一”
以计算机存储传输为例,可以将内存想象为一个一个的小格子,小格子中可以存储一个0或一个1,内存中的每一个小格子,我们称为1bit(位),一个字节(Byte)是8位(Bit)二进制,也就是说一个字节有8位的0或1。具体表现形式如下:
十进制 | 二进制 |
---|---|
1 | 0000 0001 |
2 | 0000 0010 |
3 | 0000 0011 |
4 | 0000 0100 |
5 | 0000 0101 |
6 | 0000 0110 |
7 | 0000 0111 |
8 | 0000 1000 |
9 | 0000 1001 |
10 | 0000 1010 |
八进制
- 满八进一
- 目前使用不是特别广泛,例如unix系统权限(chmod)
- 它的优势可以避免使用非数字以外的符号(十六进制除了0-9之外,要用到A-E)
十进制 | 二进制 | 八进制 |
---|---|---|
0 | 0000 0000 | 0 |
1 | 0000 0001 | 1 |
2 | 0000 0010 | 2 |
3 | 0000 0011 | 3 |
4 | 0000 0100 | 4 |
5 | 0000 0101 | 5 |
6 | 0000 0110 | 6 |
7 | 0000 0111 | 7 |
8 | 0000 1000 | 10 |
9 | 0000 1001 | 11 |
10 | 0000 1010 | 12 |
... | ... | ... |
15 | 0000 1111 | 17 |
16 | 0001 0000 | 20 |
17 | 0001 0001 | 21 |
十六进制
- 满十六进一
- 十六进制中一共有16个数字,由于十六进制是满16才进位,所以十六进制中引入了a b c d e f来表示 10 11 12 13 14 15
- 编程时候的内存调试,内存中数据、内存地址、html里面用一个8位16进制表示一个颜色一般都会以十六进制显示
- 在查看二进制数据时,一般也会以十六进制的形式显示
十进制 | 二进制 | 八进制 | 十六进制 |
---|---|---|---|
0 | 0000 0000 | 0 | 00 |
1 | 0000 0001 | 1 | 01 |
... | ... | ... | ... |
9 | 0000 1001 | 11 | 09 |
10 | 0000 1010 | 12 | 0A |
11 | 0000 1011 | 13 | 0B |
12 | 0000 1100 | 14 | 0C |
13 | 0000 1101 | 15 | 0D |
14 | 0000 1110 | 16 | 0E |
15 | 0000 1111 | 17 | 0F |
16 | 0001 0000 | 20 | 10 |
17 | 0001 0001 | 21 | 11 |
18 | 0001 0010 | 22 | 12 |
19 | 0001 0011 | 22 | 13 |
20 | 0001 0100 | 24 | 14 |
小结
进制位 | 二 | 八 | 十 | 十六 |
---|---|---|---|---|
规则 | 逢二进一 | 逢八进一 | 逢十进一 | 逢十六进一 |
基数 | 2 | 8 | 10 | 16 |
数码 | 0,1 | 0~7 | 0~9 | 09,AF(大小写不敏感) |
位权 | 2^i | 8^i | 10^i | 16^i |
表示 | B(Binary) | O(Octal) | D(Decimal) | H(Hexadecimal) |
为什么要有二进制、八进制、十六进制?
二进制上述有说道是因为简便,可以很方便在电路中表示,尤其是计算机在传输数据时,我们知道网络在传输数据实际上就是在传输电信号,所以我们采用了二进制。
从上述表示示例中可以看出,进制越大标示的数据越简便,所以有了大的进制,而采用2、8、16进制是因为2、8、16分别是2的1次方,3次方,4次方。这一点使得三种进制之间可以非常直接地互相转换。8进制或16进制缩短了二进制数,但保持了二进制数的表达特点。
例如:十进制的100, 二进制表示为:0110 0100,八进制表示为:144,十六进制表示为:64
数据的存储
- 基本单位
- 位(Bit) ----- 可存储一位二进制数(0或1)
- 存储容量
- 1B(byte,字节) = 8 Bit
- 1KiB(Kilobyte,千字节) = 1024B = 2^10 B = 1024bit * 8 = 8Kb
- 1MiB(Mebibyte,兆字节,百万字节,简称"兆") = 1024KiB = 2^20 B
- 1GiB(Gibibyte,吉字节,十亿字节,简称"千兆") = 1024MiB = 2^30 B
要注意的是这里采用的是二进制前缀表示法,由国际标准化组织(ISO)和国际电工委员会(IEC)联合制定和颁布,并且内存的单位制(JEDEC标准)也与之相同
- 区别于十进制表示(国际单位制标准(SI))的容量单位
- 1KB = 1000B = 10^3B
- 1MB = 1000KB = 10^6B
- 1GB = 1000MB = 10^9B
- 硬盘生产商、Mac OS、Linux采用以GB(十进制,)计算
- windwos采用GiB(二进制标准)计算
- 这也是为什么会出现windows上的硬盘容量到linux显示并一致的原因
- 同样根据硬盘厂商与用户对于1MB大小的不同理解,所以好多160G的硬盘实际容量按计算机的1MiB=1024KB算都不到1TB,这也可以解释为什么新买的硬盘“缺斤短两”并没有它所标示的那么大。
- 当然国内用户一般理解为1MiB=1M=1024 KB, 所以为了便于中文化的理解,翻译MiB为MB都是可以的。
- 字(word):若干字节(B)组成
- 字长:是用来表示一次性处理事务的固定长度。一个字的位数,计算机系统结构中的重要指标
- 计算机处理的典型数值也可能是以字长为单位。CPU和内存之间的数据传送单位也通常是一个字长。
- 还有内存中用于指明一个存储位置的地址也经常是以字长为单位的。
- 现代计算机的字长通常为16、32、64位。
中文字符、英文字符、标点符号分别占用多少字节?
- utf8编码 长度1~3字节
- 英文字符(字符和符号)占一个字节,中文字符(汉字和符号)占三个字节
- ANSI编码
- 英文字符(字符和符号)占一个字节,中文字符(汉字和符号)占两个字节
- unicode编码
- 英文字符(字符和符号)、中文字符(汉字和符号)都统一占两个字节
任意进制之间的转换
从上述对比我们可以了解到进制的规律:
- n进制,逢n进一
- 这里有个特殊的对称三进制:以-1、0、1来计数,感兴趣的可以自行百度
- 基数:进制中允许使用的数码个数
- 简单理解就是,可以出现多少个数字,二进制基数为2,八进制基数为8,十六进制基数为16
- 位权:不同位置的数码说代表的数值,进制的位置 -1 次方
-
个位位权:0,十位位权:1,百位位权:2 以此类推
-
知道这些之后我们开始拆解各个进制
这里用()10、()5分别来表示十进制、五进制
二进制拆解
这里是以十进制来拆解的二进制,如果以二进制来拆解二进制,如下所示
- 由于二进制中不存在2,所以需要将2转换为10
转换之后通过乘法运算等到原来的二进制数
由此我们可以用来转换其他进制了
常见进制间转换
-
十进制 —> 二进制
- 整数:除2倒取余数
- 小数:除2倒取整数
-
十进制 —> 八进制
- 整数:除8倒取余数
- 小数:除8倒取整数
-
十进制 —> 十六进制
- 整数:除16倒取余数
- 小数:除16倒取整数
1)、二、八、十六进制 转换 十进制与上述同理,采用的是位权展示式
2)、十进制 转换 二、八、十六
- 整数位:除基数取余
- 小数位:乘基数取整
八进制示例: 十进制123 对应八进制位173
二进制示例:十进制135 对应二进制1000 0111
其他进制以此类推
3)、二、八、十六进制间转换
二进制转八进制
- 从小数点开始,整数部分向左、小数部分向右,每3位为一组用一位八进制的数字表示,不足3位用0补位(取3合1),就得到一个八进制数
二进制转十六进制
- 只要从小数点位置开始,向左或向右每四位二进制划分一组,不足四位数可补0(取4合1),就得到一个十六进制
八进制和十六进制之间转换
- 通过二进制作为中间态再去转换比较容易