美文网首页
一阶段day3-进制、原码反码补码、位运算、字符串

一阶段day3-进制、原码反码补码、位运算、字符串

作者: ATM_shark | 来源:发表于2018-09-27 19:46 被阅读0次

    一、进制

    计算机在存储数据的时候都是以二进制的形式去存储的
    十进制、十六进制、八进制、二进制

    1、十进制

    123、4、65、34255765879808
    基数:0、1、2、3、4、5、6、7、8、9;
    进位:逢10进1;
    每一位的值:123=1 * 100+2 * 10+3 * 1=1 * 10^2 + 2 * 10^1+ 3 * 10^0

    2、二进制

    所有二进制数都是由0和1组成; 1011、1100
    基数:0、1;
    进位:逢2进1;
    每一位的值: 11011 =1 * 2^4 + 1 * 2^3 + 0 * 2^2 + 1 * 2^1 + 1 * 2^0=27
    print(1 * 2 ** 4+1 * 2 ** 3+0 * 2 ** 2+1 * 2 ** 1+1 * 2 ** 0) #27
    即(二进制)11011=(十进制)27

    3、八进制

    基数:0、1、2、3、4、5、6、7
    进位:逢8进1;
    每一位的值: 3415 =3 * 8^3 + 4 * 8^2 + 1 * 8^1 + 5 * 8^0=1805
    print(3 * 8 ** 3 + 4 * 8 ** 2 + 1 * 8 ** 1 + 5 * 8 ** 0) #1805
    即(八进制)3415=(十进制)1805

    4、十六进制

    基数:0、1、2、3、4、5、6、7、8、9、a、b、c、d、e、f
    进位:逢16进1;
    每一位的值: 111 =1 * 16^2 + 1 * 16^1 + 1 * 16^0 = 273
    print(1 * 16 ** 2 + 1 * 16 ** 1 + 1 * 16 ** 0) #273
    即(十六进制)111=(十进制)273

    5、进制之间的转换

    a、其他进制转换成10进制:每一数位上的数乘以进制的慕次数,然后求和;
    b、10进制转换成其他进制:辗转取余法;
    例如 十进制转换二进制:

    十进制30转换二进制11110

    即十进制的数字30转换成二进制为11110;
    例如十进制转换八进制:

    十进制30转换八进制36

    即十进制的数字30转换成八进制为36;
    c、2进制转换8进制:从右往左取数,每取3位二进制转换成1位八进制;
    例如: 1 111 111=100* (1* 2^0)+ 10* (1* (2^2+ 2^1+ 2^0 ))+1* (2^2 +2^1 +2^0)=177
    d、2进制转换16进制:从右往左取数,每取4位二进制转换成1位十六进制;
    例如: 111 1101=0111 1101=
    10* (0* 2^3 +1* (2^2 +2^1 +2^0)) +1* (2^3 + 2^2 +2^0)+ 0*2^1=7d;
    e、8进制转换2进制:从右往左取数,每取1位八进制转换成3位二进制;
    f、16进制转换成2进制:从右往左取数,每取1位十六进制转换成4位二进制;

    6、Python对进制的支持

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

    a、十进制:直接写入的数字的值都是十进制的数;
    b、二进制:需要在数字前面加前缀————>0b(零B)
    print(0b1111)   #15(十进制)
    c、八进制:需要在数字前面加前缀————>0o(零欧)
    print(0o765)    #501(十进制)
    d、十六进制:需要在数字前面加前缀————>0x(零叉)
    print(0xda23)   #55843(十进制)
     e、进制的转换(结果是字符串,非数字)
    bin(整数)————>将括号内的整数,转换成二进制形式的数
    print(bin(31))     #十进制31转二进制 11111
    print(bin(0o4327)) #八进制4327转二进制 100011010111
    otc(整数)————>将括号内的整数,转换成八进制形式的数
    print(oct(31))     #十进制31转八进制37
    print(oct(0o4327)) #八进制4327转八进制4327
    hex(整数)————>将括号内的整数,转换成十六进制形式的数
    print(hex(31))     #十进制31转十六进制 1f
    print(hex(0o4327)) #八进制4327转十六进制 x8d7
    

    二、原码、反码和补码

    计算机在存数字的时候,存的是数字的二进制的补码
    计算机内存的最小单位是位:1位只能存储两个状态
    8位 = 1字节

    数据单位

    a、原码:整数数字的二进制形式

    十进制的10的二进制原码就是:1010
    最高位是符号位,如果正数符号位为0,负数符号位为1
    以16位存储数字的二进制为例
    10的原码 00000000 00001010
    -10的原码 10000000 00001010

    b、反码

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

    c、补码

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

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

    问题:为什么计算机存储数据的时候存补码?
    答:因为计算机中只有加法器,只能进行加操作。
    计算机存储数字存的是其补码,其加计算也是在补码上完成的,
    但最后结果反馈给人们看的时候,
    我们需要看原码,因为补码无法直观展示大小;
    原码、反码和补码的意义:原码是反馈给人们直观看的;
    反码是一个中间值,目的在于求出补码以及返回原码;
    补码是用来给计算机进行加操作的;

    三、位运算

    计算存储数字存补码,计算的时候也是补码,最后我们看结果看的是原码
    位运算符:&(按位与),|(按位或), ^(异或), ~(取反), >>(右移), <<(左移)

    1、&(按位与)

    数字1 & 数字2 :两个都为1结果才是1,否则为0;

    3 & 2  --> 0000 0011 & 0000 0010 == 0000 0010
    -3 & 2 --> 1111 1101 & 0000 0010 == 0000 0000
    print(3&2)  #2
    print(-3&2) #0
    

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

    2、|(按位或)

    数字1 | 数字2: 只要有一个为1,结果就是1;两个都为0,结果才是0

    3 | 2  --> 0000 0011 | 0000 0010                 =     0000 0011
    -3 | 2 --> 1111 1101 | 0000 0010 = (补)1111 1111 = (原)1000 0001 
    print(3|2)  #3
    print(-3|2) #-1
    

    3.^(异或)

    数字1 ^ 数字2: 不同为1,相同为0

    3^2  --> 0000 0011 ^ 0000 0010                 = 0000 0001
    -3^2 --> 1111 1101 ^ 0000 0010 = (补)1111 1111 = 1000 0001
    print(3^2)  #1
    print(-3^2) #-1
    

    4.~(取反)

    ~数字:将每一位取反

    ~3  ---> ~0000 0011 = 1111 1100(补) = 1000 0100
    ~-3 ---> ~1111 1101                 = 0000 0010
    print(~3)  #-4
    print(~-3) #2
    

    5.左移(重点掌握)

    数字 << 位数: 将补码向左移动指定的位数,
    符号位不变,在最后面补指定个数的0
    规律(正数和负数都实用):m << n == m * (2^n)

    print(10 << 1)    # 20     10*2^1=20
    print(-10 << 1)   # -20    -20*2^1=-20
    print(2 << 2)     # 8       2*2^2=8
    print(-23 << 2)   # -92   -23*2^2=-92
    # num * 2 == num << 1 ; num * 4 == num << 2
    

    6.右移

    数字 >> 位数: 将补码向右移动指定的位数,符号位不变,
    在符号位的后面补指定个数的0(正)或者1(负)
    规律(只适用于正数):m >> n == m // (2^n)
    规律(只适用于能整除的负数):m >> n == m //(2^n)
    规律(只适用于不能整除的负数):m >> n == m // (2^n)-1

    print(10 >> 1)  #5     10/2^1=5   (正数)
    print(10 >> 2)  #2      10//2^2=2   (正数)
    print(-10 >> 1) #-5    -10//2^1=-5   (能被整除的负数)
    print(-10 >> 2) #-3    -10//2^2-1=-3  (不能被整除的负数)
    

    四、字符串

    1、字符串(str)

    定义:Python语言中,通过单引号或者双引号引起来的字符集就是字符串;
    字符:字符串里的字符集,就是由各种不同的字符组成的;
    例如:'fhoifjskddsjfsdsflds' '2132436570787'
    '发挥而疯狂的说法房间欧萨就发你是否对' 'がいに' '关键字'

    2、Unicode编码

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

    chr(数字):获取括号内的数字在Unicode编码表中对应的字符,

    返回的是只有一个字符的字符串;
    print(chr(4)) #EOT

    ord(字符):获取字符对应的编码值;

    print(ord('蒋')) #33931

    注意:也可以直接获取字符对应的编码值,格式:\u十六进制的编码值;

    n1='gfr\u3124\ua23d积分';
    print(n1);

    输出结果

    3、转义字符

    一些特能和具有特殊意义的字符,直接放在字符串的引号中无效,需通过\来转义;
    print("hello\"world") # hello"world 中间双引号之前不加\,会报语法错误

    输出结果
    \n表示换行;

    print('好粉丝费\n分手就分手') #在\n所处位置换行

    输出结果
    \' 表示 '
    \\ 表示 \
    转义字符列表

    相关文章

      网友评论

          本文标题:一阶段day3-进制、原码反码补码、位运算、字符串

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