美文网首页
Day-3 - 进制和字符串(2018-09-27)

Day-3 - 进制和字符串(2018-09-27)

作者: 雨雨雨90 | 来源:发表于2018-09-27 17:29 被阅读0次

    一、进制

    计算机在存储数字的时候都是以二进制的形式存储的

    十进制 二进制 八进制 十六进制
    基数 0,1,2,3,4,5,6,7,8,9 0,1 0,1,2,3,4,5,6,7 0-9,a-f(A-F)
    进位 逢10进1 逢2进1 逢8进1 逢16进1
    每位的值 111 = 1 * 10^0 + 1* 10^1 + 1 * 10^2 = 111 111 = 1 * 2^0 + 1 * 2^1 + 1 * 2^2 = 7 111 = 1 * 8^0 + 1 * 8^1 + 1 * 8^2 = 73 111 = 1 * 16^0 + 1 * 16^1 + 1 * 16^2 = 273

    进制之间的转换

    • a.其他进制转换成10进制:每一位上的数乘以进制幂次数,然后求和
      例:111 = 1 * 16^0 + 1 * 16^1 + 1 * 16^2 = 273

    • b.十进制转其他进制:
      辗转取余法(不断除以进制取余,直到除到商为0为止,从最后取的余数开始写(最后取的写高位))
      例:十进制转二进制: 123:(2) 1111011 60:(2) 111100
      例:十进制转八进制: 123:(8) 173
      例:十进制转十六进制: 123:(16) 7B

    • c.二进制转八进制:每3位二进制转换成1位
      八进制转二进制:每1位8进制转换成3位的二进制
      (8)67 --> (2) 110 111

    • d.二进制转十六进制:每4位二进制转换成1位
      十六进制转二进制:一位的16进制转换成4位的二进制
      (16)67 --> (2) 0110 0111

    • e.十六进制和八进制互转:都先转换为二进制,再转换为八/十六进制

    python对进制的支持

    python支持通过二进制、八进制、十进制和十六进制的形式来直接表示整数

    • a.十进制:直接写的数字的值都是十进制的数
    10  
    100
    76
    # 78a #SyntaxError: invalid syntax
    
    • b.二进制:需要加前缀 -> 0b
    0b1010
    
    • c.八进制:需要加前缀 -> 0o
    0o67
    # 0o68 # SyntaxError: invalid syntax
    
    • d.十六进制:需要加前缀 ->0x/0X
    0x78af
    0Xdf3
    

    各进制数可以参与运算,在计算机底层统一为二进制计算,以10进制返回结果

    num = 0b1101 + 0xaf2
    print(num) # 2815
    
    • e.python中进制的转换(结果是字符串)

    bin(整数) --> 将括号中的整数,转换成二进制形式的数

    print(bin(100),bin(0o56),bin(0xdf2)) # 0b1100100 0b101110 0b110111110010
    print(type(bin(100))) # <class 'str'>
    

    oct(整数) --> 将括号中的整数,转换成八进制形式

    print(oct(100),oct(0b0111),oct(0xdf2)) # 0o144 0o7 0o6762
    

    hex(整数) --> 将括号中的整数,转换成十六进制形式

    print(hex(100),hex(0b11010111),hex(0o763)) # 0x64 0xd7 0x1f3
    

    二、原码、反码和补码

    计算机在存数字的时候,存的是数字的二进制的补码

    计算机内存的最小单位是位:1位只能存储两个状态
    8位 = 1字节
    C语言int型(32位)数字1:
    00000000 00000000 00000000 00000001

    • a.原码:整数数字的二进制形式
      十进制的10的原码:1010
      最高位是符号位,如果是整数符号位为0,负数符号位为1
      10的原码 00000000 00001010
      -10的原码 10000000 00001010

    • b.反码
      正数的反码是它的原码
      负数的反码就是这个数的原码的符号位不变,然后其他位置上的数取反(0->1,1->0)
      -10 -> (原码)10000000 00001010 -> (反码) 11111111 11110101

    • c.补码
      正数的补码就是它的原码
      负数的补码就是它的反码加1
      -10 -> (反码) 11111111 11110101 -> (补码) 11111111 11110110

    总结:正数的反码和补码都是原码;负数的补码是反码加1,反码是原码符号位不变,其他位取反

    为什么计算机存储数据的时候存补码?:计算机只有加法器,只能进行加操作,存原码对负数进行加操作的时候有问题

    三、位运算

    计算机存数字存补码,计算的时候也是补码,最后结果看的时候看原码

    位运算符:&(按位与),|(按位或),^(异或),~(取反),>>(右移),<<(左移)

    1. &(按位与):
      数字1 & 数字2:二进制的每一位,两个都为1,结果才是1,否则为0
      3 & 2 --> 00000011 & 00000010 == 00000010
      -3 & 2 --> 11111101 & 00000010 == 00000000
    print(3&2) # 2
    print(-3&2) # 0
    

    作用:让指定位上数置零,或者保留某一位上的值

    1. |(按位或)
      数字1 | 数字2:二进制的每一位,只要有一个位1,结果就是1,;两个都为0,结果才是0
      3 | 2 --> 00000011 | 00000010 == 00000011
      -3 | 2 --> 11111101 | 00000010 == 1111 1111(补码) == 1111 1110(反码) == 1000 0001(原码)
    print(3|2) # 3
    print(-3|2) # -1
    
    1. ^(异或)
      数字1 ^ 数字2:二进制的每一位,不同为1,相同为0
      3 ^ 2 --> 00000011 ^ 00000010 == 00000001
      -3^2 --> 1111 1101 ^ 00000010 == (补)1111 1111 == (原)1000 0001
    print(3^2) # 1
    print(-3^2) # -1
    
    1. ~(取反)
      ~数字:将每一位取反
      ~3 ---> ~00000011 = 11111100(补) = 1111 1011(反) = 1000 0100(原)
      ~-3 ---> ~1111 1101 = 0000 0010
    print(~3) # -4
    print(~-3) # 2
    
    1. << (左移)
      数字 << 位数:将补码向左移动指定的位数,在最后面补指定个数的0
      (摘自CSDN)负数的左移:和整数左移一样,在负数的二进制位右边补0,一个数在左移的过程中会有正有负的情况,所以切记负数左移不会特殊处理符号位。如果一直左移,最终会变成0。
    • 规律(正数和负数都适用):m << n == m * (2^n)
    print(-10 << 1) # -20
    print(10 << 3) # 80
    

    num * 2 推荐使用 num << 1,位运算效率高,执行速度快

    1. >> (右移)
      数字 >> 位数:将补码向右移动指定的位数,符号位不变,在符号位的后面补指定个数的0(正数)或者1(负数)
    • 规律(只适用于正数)m >> n == m // (2^n)
    print(10 >> 1) # 5
    print(10 >> 2) # 2
    print(-10 >> 1) # -5
    print(-10 >> 2) # -3
    # 练习:
    # print(-15 >> 1)
    # print(17 << 2)
    

    四、认识字符

    字符串(str)

    1. 什么是字符串

    python中通过单引号或者双引号引起来的字符集就是字符串
    字符串中引号中的字符集,就是由各种不同的字符来组成的
    例:

    '老白干'
    "welcome"
    "^_^"
    '1234'
    'in'
    '82年拉菲'
    

    2. Unicode编码

    python中的字符串中的字符采用的是Unicode编码
    Unicode编码:是通过两个字节来对一个字符进行编码,0 ~ (2^16-1)(65535),几乎包含了世界上所有的符号
    ASCII编码:通过一个字节来对一个字符进行编码
    Unicode编码中包含了ASCII码表

    print(2**16-1)
    

    'a' --> 97
    'b' --> 98

    • chr(数字):获取数字在Unicode编码表中对应的字符
    print(chr(97)) # a
    print(chr(0x1897)) # ᢗ
    for i in range(0x0900,0x0980):
        print(chr(i),end='')
    print('')
    
    • ord(字符):获取字符对应的Unicode码
    print(ord('余'),ord('笑'),ord('宇')) # 20313 31505 23431
    

    可以直接在字符串中写字符对应的编码值,格式:\u四位的十六进制的编码值(不带0x前缀)

    str1 = '\u4f59'
    str2 = '\u4f59\u7b11\u5b87'
    print(str1) # 余
    print(str2) # 余笑宇
    

    3. 转义字符(适用于所有语言)

    一些特殊功能和具有特殊意义的字符,直接放在字符串的引号中无效,需要通过\来转义
    \n --> 换行
    \' --> '
    \t --> 制表符(相当于tab)
    \\ --> \
    \" --> "
    注意:转义字符是一个字符

    str3 = 'dfsf\nfsfwe'
    print(str3)
    # dfsf
    # fsfwe
    

    相关文章

      网友评论

          本文标题:Day-3 - 进制和字符串(2018-09-27)

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