02Python学习笔记之二.二【进制、原反补码、位运算】201

2019-08-17  本文已影响0人  平知
章节号 内容            
1图片格式(png) 宽度大于620px,保持高宽比减低为620px
1-1 应用
1-1-1 方法

第1章节  进制

  16进制、10进制、8进制、2进制
  计算机只能识别10,最早以此为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

上一篇下一篇

猜你喜欢

热点阅读