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
  • 相关阅读:
    移动端开发必须知道的小技巧
    前端程序员被聘用的13个开发技能
    AIOps产品与架构浅析【华为云技术分享】
    su和sudo的区别与使用【华为云技术分享】
    为什么我不喜欢数据库三范式【华为云技术分享】
    python推导式pythonic必备【华为云技术分享】
    理解递归与动态规划【华为云技术分享】
    Spring Boot 最流行的 16 条实践解读!【华为云技术分享】
    机器学习笔记(六) ---- 支持向量机(SVM)【华为云技术分享】
    独立物理机和虚拟机比较有什么优势?【华为云技术分享】
  • 原文地址:https://www.cnblogs.com/Zzbj/p/15569825.html
Copyright © 2011-2022 走看看