python-位运算

警告
本文最后更新于 2022-12-01 21:11,文中内容可能已过时。

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

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

1.按位与&:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#下面的与运算结果是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.按位或|:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
>>> 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.按位异或^:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
>>> a = 15
>>> b = 36
>>> a ^ b
47

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

4.按位取反~:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
>>> 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

按位左移<<:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
>>> a = 15
#左移两位
>>> a << 2
60

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

按位右移动>>:

1
2
3
4
5
6
7
8
9
>>> a = 15
#右移两位
>>> a >> 2
3

# 计算过程
首先将a转换成二进制补码然后往右移动两位左边少的两位用0来补
a    =    0000 1111    =   15
          0000 0011    =   3
请我喝杯水
SoulChild 微信号 微信号
SoulChild 微信打赏 微信打赏
0%