美文网首页
01-02二进制、补码与位运算

01-02二进制、补码与位运算

作者: 生命的怒放 | 来源:发表于2019-01-02 17:29 被阅读0次

    一:进制

    在计算机编程中,整数可以通过二进制,八进制,十进制,十六进制

    十进制可通过方程转二、八、十六进制。倒转需要先转成二进制再转。
    二进制可通过方程转十、八、十六进制。

    1.十进制

    基数:0,1,2,3,4,5,6,7,8,9
    进位:逢十进1.
    位权:123(10) = 1 *10^2 + 2 *10^1 + 3 *10^0

    2.二进制

    基数:0,1
    进位:逢二进一
    100(2)==4(10) 二进制的100 == 十进制的4
    位权:101(2) = 1 *2^0 + 0 *2^1 + 1 *2^2 # ^次方符号。
    十进制转二控制,可用位权方程。N是2的几次方最大值,剩下的数再2的几次方,是2的几次方就是第几位数上记1,无的记0.

    3.八进制

    基数:0,1,2,3,4,5,6,7
    进位:逢八进一
    位权:123(8)= 3 *8^0 + 2 *8^1 + 1 *8^2

    `123(10)转八进制 ,8**2 =64 ,
    123 - 64 = 63 ,  7 * 8**1 =56 
    63 - 56 = 3  ,   3 * 8**0 =3
    结果即123十进制转八进制等于 173`
    
    4:十六进制

    基数:0,1,2,3,4,5,6,7,8,9, a/A(10) ,b,c,d,e,f,(也可以大写)
    进位:逢16进一
    位权:123(16) = 3 *16^0 + 2 *16^1+ 1 *16^2

    1.程序中怎么表示不同进制的数

    a.在程序中直接写的数字都是十进制。控制台打印出来的数字都是十进制的。 0后面的字母也可以是大写的

    b.二进制

    0b/B + 二进制数

    num = 0b01001110
    print(num)   #控制台打印出来会显示十进制数。
    print(bin(78)) #获取一个数对应的二进制数,控制台打印出来是字符串。
    print(bin(0x123af))  #把十六进制转二进制
    print(bin(0o123))    #把八进制转二进制
    

    八进制转二进制,每一位八进制数转成三个二进制数。(8是2的3次方)
    十六进制转二进制,每一位十六进制转成四个二进制数。(16是2的4次方)

    c.八进制

    0o/o + 八进制数

    num = 0o1345
    print(oct(800))  #把十进制转成八进制
    

    d.十六进制

    0x/X + 十六进制

    num = 0x23af
    print(hex(12357)) #转成16进制
    print(ord('一'))
    print('aaa\uffffl')
    print(hex(0o123))
    

    二:原码、反码、补码

    计算机只能存二进制的补码。

    计算机存数据只能存数字数据,而且只能存数据的二进制的补码。
    计算机对数据进行的运算的时候是使用补码进行运算的,将数据从计算机中读出来看到的是原码。

    1.原码:

    符号位 + 真值
    说明:
    符号位:最高位用0表示正数,用1表示负数。
    真值:去掉正负符号后,数字的二进制值。

    100的原码:01100100(第一位0代表正数)
    -100的原码:11100100(第一位1代表负数)

    2.反码:

    正数的反码:就是原码
    负数的反码:原码的符号位不变,其他位数取反。(取反0变成1,1变成0)

    100的反码:01100100(第一位0代表正数)
    -100的反码:10011011(第一位1代表负数)

    3.补码:

    正数的补码:就是原码
    负数的补码:反码加1.

    100的补码:01100100
    -100的补码:10011100
    print(bin(-50)) 原码 1110010 ---- 反码 1001101 ---- 补码 1001110

    4.为什么计算机要存补码?

    因为计算机中只有加法器,没有减法器。
    3-2 --->3 + (-2)
    3的原码:011 -2的原码:110 3-2 = 011 + 110 = 001
    2-3---> 2+(-3) = 110 + 011 = 001 = 1 #用原码计算,有负数时则出错。
    -3原码:1011 反:1100 补:1101
    -2原码:1010 反:1101 补:1110

    三:位运算(二进制计算)

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

    数字1 & 数字2-->两位上的数都为1结果就是1,有0结果就是0.

    0111(补) & 1101(补) --> 0101(补)
    1.特点:一个位上的数如果和1与,可以保留这个位上的数; 和0与可以置0
    2.应用:判断一个数的奇偶 (如果一个数的二进制最低位是1是奇数,否则就是偶数)

    num & 1 == 0 #(偶数)    (一个数&1,结果是二进制的最后一位。)
    num & 1 == 1 #(奇数)
    print(3 & 1)
    print(100 & 1)
    

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

    特点:和1或,置1.

    print(3|2) #0011 | 0010 = 0011(补)
    

    ~ 数字 : 将数字上的每一位取反。

    ~ 1 = 0 ,,,~0 = 1

    print(~3)   # ~0011 = 1100(补) =1011(反) = 1100
    print(~-4)
    ~~3 = 3  #取反两次等于他本身。
    

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

    应用:加密。快速判断两个数是否相等:相同的两个数异或结果是0

    print(3^2)   # 0011^0010 = 0001 = 1
    print(1^2)   #1^2 = 3
    

    数字1 << N : 数字1左移N位,数字1 * 2**N

    数字1 >> N : 数字1右移N位。数字1 // 2**N

    应用:快速乘2的次方/除2的次方。

    print(4<<1)      #8
    print(-3 << 2)   #-12
    print(5>>2)      #1
    

    相关文章

      网友评论

          本文标题:01-02二进制、补码与位运算

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