python-位运算

先简单说一些概念:
原码:从符号位开始表示,0是正数,1是负数
反码:

  • 正数的原码反码补码都是一样的。
  • 负数的反码是在其原码的基础上, 符号位不变,其余各个位取反
    比如-5转成二进制原码1101,在算出反码1010

补码:

  • 正数的原码反码补码都是一样的。
  • 负数的补码是反码+1

1.按位与&:

#下面的与运算结果是4
>>> a = 15
>>> b = 36
>>> a & b
4

# 计算过程
首先将a和b转换成二进制补码,每一位进行与运算,上下两个数都为1结果就是1,否则为0
a    =   0000 1111    =   15
b    =   0010 0100    =   36
res  =   0000 0100    =   4

2.按位或|:

>>> a = 15
>>> b = 36
>>> a | b
47

# 计算过程
首先将a和b转换成二进制补码,每一位进行或运算,上下两个数只要有一个数为1结果就是1,否则为0
a    =   0000 1111    =   15
b    =   0010 0100    =   36
res  =   0010 1111    =   47

3.按位异或^:

>>> a = 15
>>> b = 36
>>> a ^ b
47

# 计算过程
首先将a和b转换成二进制补码,每一位进行异或运算,上下两个数相同为0,不同为1
a    =   0000 1111    =   15
b    =   0010 0100    =   36
res  =   0010 1011    =   43

4.按位取反~:

>>> a = 15
>>> ~a
-16

#计算过程
首先将a转换成二进制补码,每一位进行取反
a     =   0000 1111    =   15
not   =   1111 0000    =   符号位为1(即负数)  补码 
-------------------------------------------------------
#已知补码计算反码(上面说到了负数的补码=反码+1,所以补码-1=反码)
    1111 0000
-           1 
---------------------
    1110 1111    反码
#已知反码求原码(负数的反码=原码的符号位不变,其余各个位取反,
#所以我们将数值位取反即可算出原码)
    1110 1111
    1001 0000    原码
#至此就算出了取反后的原码,我们在用8421法将二进制原码换算成10进制,最后的结果就是-16

按位左移<<:

>>> a = 15
#左移两位
>>> a << 2
60

# 计算过程
首先将a转换成二进制补码,然后往左边移动两位,右边少的两位用0来补
a    =    0000 1111    =   15
        000011 1100    =   60
          0011 1100    =   60

按位右移动>>:

>>> a = 15
#右移两位
>>> a >> 2
3

# 计算过程
首先将a转换成二进制补码,然后往右移动两位,左边少的两位用0来补
a    =    0000 1111    =   15
          0000 0011    =   3

相关文章

发表新评论