一文掌握 Python 的按位运算

计算机中所有的数据都是以二进制的形式存储在设备中。即 0、1 两种状态,计算机对二进制数据进行的运算都叫位运算。如果我们计算两个数的和,在计算机中都是转换为二进制来进行运算,所以相比在代码中直接使用(+、-、*、/)运算符,合理的运用位运算更能显著提高代码在机器上的执行效率。

位运算符在位级别执行运算,将操作数视为位序列,而不是传统的整数或浮点值。

Python 提供了六个主要的按位运算符:

  • 按位与('&'):如果操作数的两个对应位均为 1,则将结果为 1。

  • 按位或('|'):如果操作数的任一对应位为 1,则结果为 1。

  • 按位异或('^'):如果操作数的两个对应位相同,结果为 0,相异,结果为 1

  • 按位取反('~'):翻转位,将 1 更改为 0,反之亦然。

  • 按位左移('<<'):将操作数的位向左移动指定的位置数。

  • 按位右移('>>'):将操作数的位向右移动指定的位置数。

按位与('&')

参加运算的两个数据,按二进制位进行"与"运算。

运算规则:

0&0=0 0&1=0 1&0=0 1&1=1

总结:两位同时为 1,结果才为 1,否则结果为 0。

例如:

3&5 即 0000 0011& 0000 0101 = 0000 0001,因此 3&5 的值得 1。

注意:负数按补码形式参加按位与运算。

a = 5    # 101
b = 3    # 011
result = a & b
print(result)

运行结果:

1

与运算的用途:

  • 清零

如果想将一个数清零,只要与一个各位都为零的数值进行与运算,结果为零。

  • 取数的指定位

比如取数 0101 1010 的低 4 位,只需要找一个数高四位是 0,低四位是 1 的数:0000 1111,然后进行按位与运算,结果为 0000 1010,即可得到指定的位。

  • 判断奇偶

根据二进制位的最未位是 0 还是 1 来决定,为 0 就是偶数,为 1 就是奇数。因此可以与 1 进行与运算来判断是不是偶数。

按位或('|')

参加运算的两个对象,按二进制位进行"或"运算。

运算规则:

0|0=0 0|1=1 1|0=1 1|1=1

总结:参加运算的两个对象只要有一个为 1,其值为 1。

例如:3|5 即 0000 0011| 0000 0101 = 0000 0111,因此,3|5 的值得 7。

注意:负数按补码形式参加按位或运算。

a = 5    # 101
b = 3    # 011
result = a | b
print(result)

运行结果:

7

或运算的用途:

对一个数的某些位设置为 1,比如 1001 1010 的低 4 位设置为 1,与 0000 1111 进行按位或运算 1001 1111 即可得到。

按位异或('^')

参加运算的两个数据,按二进制位进行"异或"运算。

运算规则:

0^0=0 0^1=1 1^0=1 1^1=0

总结:参加运算的两个对象,如果两个相应位相同为 0,相异为 1。

a = 5    # 101
b = 3    # 011
result = a ^ b
print(result)

运行结果:

6

异或运算的用途:

  • 翻转指定位

将数 1010 1010 的低 4 位进行翻转,只需要与 0000 1111 进行异或运算即可得到 1010 0101。

  • 与 0 相异或值不变

1011 1111 ^ 0000 0000 = 1011 1111

  • 交换两个数

a = 5    # 101
b = 3    # 011
a ^= b
b ^= a
a ^= b
print(f"a = {a} b = {b}")

输出:

a = 3 b = 5

取反(~)

参加运算的一个数据,按二进制进行"取反"运算。

运算规则:

~1=0 ~0=1

总结:对一个二进制数按位取反,即将 0 变 1,1 变 0。

取反运算的用途:

  • 使一个数的最低位为零,1111&~1 结果为 1110。

左移运算符(<<)

将一个数的各二进制位全部左移若干位(相当于将左操作数乘以 2)。

10101110 << 2 结果为 10111000

a = 98
b = a << 1
print('a =',a)
print('bin(a) =',bin(a))
print()
print('b =',b)
print('bin(b) =',bin(b))
print()
a = -98
b = a << 1
print('a =',a)
print('bin(a) =',bin(a))
print('')
print('b =',b)
print('bin(b) =',bin(b)) 

输出:

a = 98
bin(a) = 0b1100010

b = 196
bin(b) = 0b11000100

a = -98
bin(a) = -0b1100010

b = -196
bin(b) = -0b11000100

右移运算符(>>)

将一个数的各二进制位全部右移若干位(相当于该数除以 2)。

a = 98
b = a >> 1
print('a =',a)
print('bin(a) =',bin(a))
print()
print('b =',b)
print('bin(b) =',bin(b))
print()
a = -98
b = a >> 1
print('a =',a)
print('bin(a) =',bin(a))
print('')
print('b =',b)
print('bin(b) =',bin(b)) 

输出:

a = 98
bin(a) = 0b1100010

b = 49
bin(b) = 0b110001

a = -98
bin(a) = -0b1100010

b = -49
bin(b) = -0b110001

文章创作不易,如果您喜欢这篇文章,请关注、点赞并分享给朋友。如有意见和建议,请在评论中反馈或 V:信息科技云课堂。