zoukankan      html  css  js  c++  java
  • Python之位运算

    在计算机中所有的数都是以二进制的形式存在的,位运算就是直接对整数在计算机中对应的二进制位进行操作。

    位运算分为 6 种如下:

    按位与 &
    按位或 |
    按位异或 ^
    按位取反 ~
    左移运算 <<
    右移运算 <<

    重点:二进制数在内存中以补码的形式存储!!,因此位运算都是要基于补码进行操作的

    原码、反码、补码:https://www.cnblogs.com/Zzbj/p/13621019.html

    一、按位与

    运算中的两个数,二进制的对应位都为1,则该位的结果为1,否则为0。

    a = 40
    b = 10
    c = a & b
    """
    按位与
    40 = 010 1000补
    10 = 000 1010补
    8  = 000 1000补=原
    """
    print(c)  # 8

    二、按位或

    运算中的两个数,二进制的对应位中只要有一个为1时,结果位就为1,否则为0。

    a = 40
    b = 10
    c = a | b
    """
    按位或
    40 = 010 1000补
    10 = 000 1010补
    42 = 010 1010补=原
    """
    print(c)  # 42

    三、按位异或

    运算中的两个数,二进制的对应位中当两个对应位相异时,结果为1,否则为0。

    a = 40
    b = 10
    c = a ^ b
    """
    按位异或
    40 = 010 1000补
    10 = 000 1010补
    34 = 010 0010补=原
    """
    print(c)  # 34

    四、按位取反

    把二进制数的每个二进制位取反,即把1变为0, 把0变为1。

    a = 40
    c = ~a
    """
    按位取反
    注意:
    1.由于二进制数在内存中以补码的形式存储,所以我们需要把得到的二进制数转成补码
    正数原反补一样,第一个0是符号位。
    40补 = 010 1000
    
    2.按位进行取反,把40的补码进行按位取反,得到的也是一个补码
    取反[补] = 101 0111
    
    3.取反后的二进制补码转为原码计算数值
    但是由于按位取反后变为负数,所以我们需要用负数的补码转换规则:符号位不变,按位取反,末位加一
    取反[原] = 110 1001 = -41
    """
    print(c)  # -41

    五、左移运算

    将一个数的各二进制位全部左移若干位,由"<<"右边的数指定移动的位数,高位丢弃,低位补0。

    运算结果式子:

    x 为整数
    x << n = x * (2ⁿ)  # x 乘以 2的n次方
    a = 40
    c = a << 2
    """
    左移运算
    40 = 0010 1000补
     (00)1010 0000补=原 高位丢弃,低位补0
    """
    print(c)  # 160

    六、右移运算

    将一个数的各二进制位全部右移若干位,由">>"右边的数指定移动的位数,低位移出(舍弃),高位的空位补符号位,即正数补0,负数补1。

    运算结果式子:

    x 为整数
    x >> n = x / (2ⁿ)  # x 除以 2的n次方
    a = 40   #  40补 = 010 1000
    b = -40  # -40补 = 101 1000
    c = a >> 2
    d = b >> 2
    e = a & b
    """
    右移运算:低位移出(舍弃),高位的空位补符号位,即正数补0,负数补1
     40 = 010 1000  补
          000 1010(00)补=原=10
    
    -40 = 101 1000 补
          111 0110(00) 补
          100 1010 原 = -10
          
    按位与
     40 = 010 1000 补
    -40 = 101 1000 补
          000 1000 补=原
    """
    print(c)  # 10
    print(d)  # -10
    print(e)  # 8
  • 相关阅读:
    PAT 甲级 1027 Colors in Mars
    PAT 甲级 1026 Table Tennis(模拟)
    PAT 甲级 1025 PAT Ranking
    PAT 甲级 1024 Palindromic Number
    PAT 甲级 1023 Have Fun with Numbers
    PAT 甲级 1021 Deepest Root (并查集,树的遍历)
    Java实现 蓝桥杯VIP 算法训练 无权最长链
    Java实现 蓝桥杯VIP 算法训练 无权最长链
    Java实现 蓝桥杯 算法提高 抽卡游戏
    Java实现 蓝桥杯 算法提高 抽卡游戏
  • 原文地址:https://www.cnblogs.com/Zzbj/p/15569825.html
Copyright © 2011-2022 走看看