zoukankan      html  css  js  c++  java
  • python位运算

    什么是位运算

    位运算就是把数字当成二进制来进行计算,位运算有六种:&(与), |(或), ^(异或), ~(非), <<(左移), >>(右移)

    &(与)

    &运算规则:两个位都为1,结果为1,否则为0

    # &(与)
    a = 3
    b = 9
    print(a & b)
    
    # a----0101
    # b----1001
    # a&b--0001
    # a&b=1
    
    

    ## |(或) |运算规则:两个位至少有一个为1,结果为1,否则为0 ```python # |(或) a = 3 b = 9 print(a | b)

    a----0101

    b----1001

    a|b--1101

    a|b=11

    
    <br>
    ## ^(异或)
    ^运算规则:两个位不同,结果为1,否则为0
    ```python
    # ^(异或)
    a = 3
    b = 9
    print(a ^ b)
    
    # a----0101
    # b----1001
    # a^b--1100
    # a^b=10
    
    

    ## ~(非) ~运算规则:对所有位取反,1变成0,0变成1 ```python a = 5 print(~a)
    
    猜猜结果是多少?是不是以为是2,哈哈哈
    看一下打印结果
    ```python
    -6
    

    what? 检查下计算过程

    # a----101
    # ~a--010
    # ~a=2
    
    

    按照运算规则,没错啊

    这是为什么呢?其实,计算机中是以补码的形式来进行计算的

    对于正数:
    原码=反码=补码

    对于负数:
    反码=原码的符号位不变,其余位取反;
    补码=反码+1

    使用sys.getsizeof可以查看对象在内存空间占用的大小

    import sys
    a = 5
    print(sys.getsizeof(a))  # 28
    
    

    说明a在内存中占的位数是28

    现在我们来一步一步等推算~a
    a的二进制形式

    0000  00000000  00000000  00000101
    
    

    由于运算是以补码的形式进行,因此要将原码转化成补码,由于a为整数,因此其补码就等于原码 ```python # a的补码 0000 00000000 00000000 00000101
    <br>
    
    对a的补码进行~运算,结果为
    ```python
    # 结果的补码
    1111  11111111  11111111  11111010
    
    

    到这里要注意了,计算机运算的时候是以补码的形式,但是显示到终端上还是以原码的形式,因此我们要把结果再转化回原码
    由于结果为负数(符号为1),先把补码转化成反码,反码=补码-1

    # 结果的反码
    1111  11111111  11111111  11111001
    
    

    再计算结果的原码

    # 结果的原码
    1000  00000000  00000000  00000110
    
    

    再把结果的二进制转化成十进制形式,符号为1说明是负数,-(4+2)= -6,因此结果为-6
    上面的计算过程只是让我们对计算机如何进行位运算有一个认识,实际上对于任意数a,~a = -(a+1),根本不用手工转化成二进制计算


    ## <<(左移位) <<的规则:运算数的各二进位全部左移若干位,由<< 右边的数字指定了移动的位数,高位丢弃,低位补0。 ```python a = 9 print(a << 2) # 36
    对于整数a,a<<n等效于 a*2**n,也就是说移位运算可以替代乘法运算
    
    
    <br> 
    ## >>(右移位)
    '>>'的规则:运算数的各二进位全部右移若干位,>> 右边的数字指定了移动的位数
    
    ```python
    a = 9
    print(a >> 2)  # 2
    

    对于整数a,a<<n等效于 int(a/2**n),向右移位可以代替除法运算

  • 相关阅读:
    Tjoi 2017 异或和
    Noi 十连测 建造记者站
    Noi 十连测 基因改造计划
    Noi 十连测 人生的经验
    NOI 十连测 Round 5 T2 运河计划
    NOI 十连测 Round 5 T1
    【ZJOI2018】迷宫
    BZOJ 十连测 day5 T3
    BZOJ 十连测 可持久化字符串
    BZOJ 十连测 二进制的世界
  • 原文地址:https://www.cnblogs.com/zzliu/p/10629532.html
Copyright © 2011-2022 走看看