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

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

作者: 平知 | 来源:发表于2019-08-17 08:20 被阅读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
    
    

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/vyqhsctx.html