章节号 | 内容 |
---|---|
1图片格式(png) | 宽度大于620px,保持高宽比减低为620px |
1-1 | 应用 |
1-1-1 | 方法 |
第1章节 进制
16进制、10进制、8进制、2进制
计算机只能识别1
和0
,最早以此为2进制。但是人难以读0和1,所以需要在人类认识的字符和0与1之间做转换。从而引出16进制、10进制、8进制等进制和字符编码(把人识读的字符转换成0和1组成的数字串)等。
16进制:1,2,3,4,5,6,7,8,9,a,b,c,d,e,f(15),10(16)
第2章节 原码、反码、补码
首先我们考虑字符,包括汉字、数字、英文字符、各种语言等等,每一个单个的字符,要先规定到底用几个0或者1来表示,一个0或者一个1设定为一个bit,即一个位;八个0或者1就是8个bit,一个Byte,即一个字节。
↑为了表示正负数,把最左边一位定为符号位,0为正,1为负。考虑1加上-1的情况是什么。
0000 0000 0000 0001
#加上
1000 0000 0000 0001
↑单纯考虑二进制的情况,发现二进制的1加上-1等于如下:
1000 0000 0000 0010
↑字面值等于-2
。这明显和实际结果相悖。
由此引入:反码,补码
规则:正数:原=反=补
规则:负数:反=符号位不变,其他位取反
规则:负数:补=反码+1
#-1原码
1000 0000 0000 0001
#-1反码
1111 1111 1111 1110
#-1补码
1111 1111 1111 1111
正负数相加改为(两个数的补码
相加):
#-1补码
1111 1111 1111 1111
#1补码
0000 0000 0000 0001
#注意这是一个补码的结果,还要再转换回原码才行
0000 0000 0000 0000
↑结果其实是有一个进位的,但是这里看这16位就等于0。
负数的补码转换回原码:
符号位不变,取反,加1(和原码变补码过程相同)
#-1补码
1111 1111 1111 1111
#-1原码计算过程
1000 0000 0000 0000
+
0000 0000 0000 0001
=
1000 0000 0000 0001
↑正好等于-1
第3章节 进制转换
In [92]: bin(18)
Out[92]: '0b10010'
In [93]: bin(-18)
Out[93]: '-0b10010'
↑0b表示是二进制
In [94]: hex(18)
Out[94]: '0x12'
In [95]: hex(-18)
Out[95]: '-0x12'
↑0x表示是十六进制
In [97]: oct(18)
Out[97]: '022'
In [98]: oct(-18)
Out[98]: '-022'
↑python2的八进制
In [1]: oct(18)
Out[1]: '0o22'
In [2]: oct(-18)
Out[2]: '-0o22'
↑python3的八进制
In [3]: int(-0o22)
Out[3]: -18
In [4]: int(-0x12)
Out[4]: -18
In [5]: int(-0b10010)
Out[5]: -18
In [6]: int("0x12",16)
Out[6]: 18
第4章节 位运算
#5
0000 0000 0000 0101
#左移一位,得10
0000 0000 0000 1010
#再左移一位,得20
0000 0000 0001 0100
↑结论:左移一位,等于乘以2。快速完成这种乘法,可以用位运算进行
。
↑结论:右移一位,等于除以2。快速完成这种除法,可以用位运算进行
。
运算符:
1、& 按位与
2、| 按位或
3、^ 按位异或
#如果a、b两个位不相同,则异或结果为1。如果a、b两个值相同,异或结果为0。
In [24]: 0b1100^0b0001
Out[24]: 13
4、~ 按位取反
In [19]: ~2
Out[19]: -3
5、<< 按位左移
6、>> 按位右移
In [12]: 5<<1
Out[12]: 10
In [13]: 8>>2
Out[13]: 2
取反运算的特殊性(原因是:在计算机系统中,数值都是以补码来表示和存储的
)
In [31]: bin(~9)
Out[31]: '-0b1010'
In [32]: bin(~0b1001)
Out[32]: '-0b1010'
首先,9是正数,原反补相同。
0000 1001
取反
1111 0110
这就是9的补码的取反
接下来,要转换成我们认识的数字。python中数都是分正负的,所以的一位符号位固定保留的,
这里系统会判定为这是个负数,所以第一位不变。
`符号位不变,其他位取反,再加一,变会原码`
10001001
加1
10001010
↑最后结果为:-10
↓下面再类推一个-9的取反等于几?
In [33]: ~-9
Out[33]: 8
In [34]: bin(~(-0b1001))
Out[34]: '0b1000'
In [35]: ~(-0b1001)
Out[35]: 8