进制
进制的基本概念
(1)基本概念
进位机制, 通俗的讲, 逢几往前进一位。
(2)生活中的进制举例:
1024byte = 1kb;
1024kb = 1Mb;
1024Mb = 1Gb;
1024Gb = 1Tb;
像存储就是1024进制, 逢1024往前进一位
还有例如时间, 60进制, 60秒1分钟, 60分钟1小时
(3)基数的概念
基数指的是某进制每一位可以表示数的个数
比如十进制,每一位上的数就是,从0到9, 共10个数, 所以十进制的基数就是10.
(4)进制存在的意义.
用有限的数字来表示无限的数.
计算机中常见的进制
二进制:每一位只有0和1两个数
八进制:每一位只有0-7 八个数
十六进制: 每一位是从0-F 十六个数
进制的快速对照表
十进制 | 二进制 | 八进制 | 十六进制 |
---|---|---|---|
0 | 000 | 0 | 0 |
1 | 001 | 1 | 1 |
2 | 010 | 2 | 2 |
3 | 011 | 3 | 3 |
4 | 100 | 4 | 4 |
5 | 101 | 5 | 5 |
6 | 110 | 6 | 6 |
7 | 111 | 7 | 7 |
8 | 1000 | 10 | 10 |
9 | 1001 | 11 | 9 |
10 | 1010 | 12 | A |
11 | 1011 | 13 | B |
12 | 1100 | 14 | C |
13 | 1101 | 15 | D |
14 | 1110 | 16 | E |
15 | 1111 | 17 | F |
16 | 10000 | 20 | 10 |
17 | 10001 | 21 | 11 |
进制转换
(1)为什么要使用进制转换
计算机是由大量的电子元器件组成的, 电子器件的状态通常只有,打开和关闭, 所以用0和1,来表示状态. 计算机最终对于数据的处理都是处理的二进制数,但是人能看懂的是十进制,所以会用进制转换.
(2)十进制转N进制
方法: 连除倒取余
转N进制, 就是用这个数,除以N进制的基数, 一直除倒商为0为止, 此时,倒取每次的余数.
如:26转化为二进制
2 | 26 | |
---|---|---|
2 | 13 | 0 |
2 | 6 | 1 |
2 | 3 | 0 |
2 | 1 | 1 |
0 | 1 | |
结果: | 11010 |
如:53转为八进制
8 | 53 | |
---|---|---|
8 | 6 | 5 |
0 | 6 | |
结果: | 65 |
如:160转十六进制
16 | 160 | |
---|---|---|
16 | 10 | 0 |
0 | A | |
结果: | A0 |
(3)N转换成10进制
方法: 按权求和法
比如:十进制的563转十进制
500 + 60 + 3
5 * 10 ^ 2 + 6 * 10^ 1 + 3 * 10^ 0
权:权重的意思, 10就是权.
位权: 权所在的位置, 位权自右向左,从0开始
二进制转十进制
1101 转十进制:
1 * 2^3 + 1 * 2^2 + 0 * 2^1 + 1 * 2^0 = 13
八进制转十进制:
64:
6 * 8^1 + 4 * 8^0 = 52
十六进制转十进制:
CF
12 * 16^1 + 15 * 16 ^ 0 = 207
(4)N进制转N进制
一个八进制位,代表三个二进制位;
一个十六进制位,代表四个二进制位;
例子1:
二进制转八进制:
011110
自右向左3个分开
011 110
3 6
结果就是:36
例子2:
八进制转二进制:
47
每个八进制位用3个二进制位表示:
100 111
结果就是: 100111
例子3:
二进制转十六进制
1001111
自右向左,4个分开,不足的补0
0100 1111
4 F
结果就是4F
例子4:
十六进制转二进制
BD
每一个十六进制位,用4个二进制位表示
1011 1101
结果就是:10111101
思考:如果8进制和16进制之间互转?
16进制的AE转成八进制:
先把AE换成2进制:
1010 1110
再自右向左3个分开:
010 101 110
2 5 6
结果就是256
(5)二进制到10进制的快速转换。
比如8位2进制数
1 1 1 1 1 1 1 1
128 64 32 16 8 4 2 1
也就是每一位的1代表的数字
那么比如:
1101转成十进制,快速口算:8 + 4 + 0 + 1 = 13;
返过来:
29转二进制,
先把离29最近的二进制位置1,代表已经表示16了,还剩13,
再把离13最近的8置,代表表示了8,还剩5,以此类推
11101
(6)给出了一个数,如何得知它是几进制呢
十进制: 46, 89
二进制: 0b11011100
八进制: 073, 035
十六进制: 0x41, 0xA0
5,字节与位的关系
字节: byte
位: bit 二进制位,也叫比特位
1byte = 8bits;
1byte 最大存储容量,就是8个bit位全部为1时, 存储倒255
生活的一个例子:100M带宽,下载速度永远到不了100M,因为100M的单位是100Mbps(100M bits per seconds),而我们下载工具能看到最慢速率是byte,
所以最高下载速率,是100M的8分之1,大约12.5M
机器数,真值,原码,反码,补码
A,机器数:一个数在计算机中的二进制表示形式。(等同于原码)。
B,真值:这个数真正意义上的数值。(区别于形式值,形式值就是按位权求和得到的值。真值有符号位的概念,符号位要单拿出来,不能当数字看待。)
C,原码:就是机器数带符号位。
2的原码是 0b00000010
-2的原码是0b10000010
如果用原码进行2+(-2)的运算:
0b00000010
0b10000010 +
0b10000100
还原成真值得时候因为最高位是1, 认为是负数,最终得到的结果是-4. 和人类预期结果不一样,所以计算机就摒弃了使用原码进行运算方式, 引入了反码.
D,反码:正数的反码和原码一样,负数的反码是 符号位不变,其他各位取反。
+2的反码: 0b0000 0010(和原码一样)
-2 的反码: 0b1111 1101 (除了符号位不动, 其他各位取反)
0b0000 0010
0b1111 1101 +
0b1111 1111
还原成真值, 就是符号位不变, 其他位取反,得到0b1000 0000, 也就是对应-0, 达到了运算的目的,但是产生了歧义, 计算机出现了两个0, 一个+0, 一个-0, +0对应的二进制就是0b0000 0000, -0对应的二进制就是0b1000 0000, 虽然人知道+0和-0是同一个数,但是计算机认为是两个数.
所以,就引入了补码来解决计算机数据运算的问题.
E,补码:正数的补码等于原码。负数的补码等于负数的反码+1.
+2补码:
0b0000 0010 (补码和原码一样)
-2的补码
0b1000 0010(-2原码)
0b1111 1101 (取反码)
0b1111 1110(-2的补码)
2+(-2)使用补码进行运算
0b0000 0010(+2的补码)
0b1111 1110(-2 的补码)
0b100000000
因为我们是用1个字节进行运算, 相加之后就产生了溢出, 多出的一位就被截掉了,最终结果就是0b0000 0000
最重要的一点:
计算机中存储的数据是以二进制补码的形式存储的.
从内存中取出二进制数的时候, 需要还原成真值.
真值得还原过程(负数):
补码→ - 1→取反码→原码→真值.
位运算
(1)按位与 & 运算
对两个数的二进制位进行与&运算.
有0为0, 全1为1.
例子1:
5 & 3
0b0000 0101 (5的补码)
0b0000 0011 (3的补码)
0b0000 0001 (结果的补码)
取真值:
1
例子2:
-5 & 3
0b1000 0101(-5的原码)
0b1111 1010(-5的反码)
0b1111 1011(-5的补码)
0b0000 0011(3的补码) &
0b0000 0011(结果的补码)
取真值:
最高是0,是正数,3
例子3:
-5 & -3
0b1000 0101(-5的原码)
0b1111 1010(-5的反码)
0b1111 1011(-5的补码)
0b1000 0011(-3的原码)
0b1111 1100(-3的反码)
0b1111 1101(-3的补码)
0b1111 1011(-5的补码) &
0b1111 1001(结果的补码)
取真值:
最高位是1,是负数
0b1111 1000 (-1)
0b1000 0111 (取反)
结果:-7
思考题:
有任意一个1个字节的二进制数如0b1101 0011,如何把高四位清0,变成0b0000 0011?
让这个数&上0b0000 1111,就能把高四位清0
0b1101 0011
0b0000 1111 &
0b0000 0011
&运算作用,就是为了清0
(2)按位或 |
对两个数的二进制位进行或|运算.
有1为1, 全0为0.
7 | 9:
0b0000 0111(7的补码)
0b0000 1001(9的补码)
0b0000 1111(结果的补码) |
取真值:
最高是0, 是正数, 结果就是15;
7 | -9:
0b0000 0111(7的补码)
0b1000 1001(-9的原码)
0b1111 0110(-9的反码)
0b1111 0111(-9的补码)
0b0000 0111(7的补码) |
0b1111 0111(结果的补码)
取真值:
最高是1,是负数
0b1111 0110 (-1)
0b1000 1001 (取反)
结果-9;
思考题:
如何将任意一个1个字节的二进制数0b1011 0101 低四位全部置1?
把这个二进制数,或|上一个 0b0000 1111,就可以把低四位全部置1
或|运算的作用就是为了置1
(3)按位非(按位取反) ~
对一个二进制数逐位取反.
~ -10
0b1000 1010(-10的原码)
0b1111 0101(-10的反码)
0b1111 0110(-10的补码)
0b0000 1001(结果补码)
取真值:
9
~ 4
0b0000 0100(4的原码)
0b1111 1011 (取反运算结果的补码) ~
取真值:
最高位为1,为负数
0b1111 1010 (-1)
0b1000 0101 (取反)
结果位:-5
公式:对A取反(取非运算)
结果: -(A+1)
(4)按位异或 ^
对两个数的二进制位进行异或^运算.
相异为1, 相同为0
-5 ^ -3
0b1000 0101 (-5的原码)
0b1111 1010 (-5的反码)
0b1111 1011 (-5的补码)
0b1000 0011 (-3的原码)
0b1111 1100 (-3的反码)
0b1111 1101 (-3的补码)
0b1111 1011 (-5的补码) ^
0b0000 0110 (结果的补码)
取真值:
6;
(5)左移运算符 <<
0b 0000 0011
0b 0000 0011 << 1
0b 0000 0110
结果是6
左移1位相当于乘以2
左移n位相当于乘以2^n
(6)右移运算符 >>
0b 0000 1000
0b 0000 1000 >> 1
0b 0000 0100
结果是4
右移1位相当于除以2
右移n位相当于除以2^n