一、有6种为运算符
1.按位与 【&】:仅当两个位操作数都为1,输出结果才为1,否则都输出为0
2.按位或 【|】:仅当两个位操作数都为0,输出结果才为0,否则都输出为1
3.按位异或 【^】:仅当两个位操作数不同时,输出结果才为1,否则都输出为0
4.按位取反 【~】:将每一位取反,也就是1变成0,0变成1
5.按位左移 【<<】:m<<n,按位左移运算,m对应的二进制数的每位向左移动n位,后面补0
6.按位右移 【>>】:m>>n,即m对应的二进制数每位向右移动n位,移出的二进制数字去掉,最左边空出的变为0
二、Python中的位运算符与其它语言中的位运算符作用相同。
位运算符也称二进制运算符,并且这些运算符只用于对整型数进行运算。
进行位运算时,整型数被转换为二进制形式,然后位运算符对每位执行有关运算后,将结果再转换回十进制形式,并返回给用户。
(1)&:按位与运算
对应位上的二进制数进行与运算,如果参加位运算的两个二进制数为1,则结果为1,只要有一个为0,则结果为0,如10和4进行按位与运算,他们对应的二进制形式分别为:1010 和 0100,则:
1 0 1 0
& 0 1 0 0
-----------
0 0 0 0
即10和4按位与运算的结果为二进制的0,也对应着10进制的0,最终结果即为0,即 10 & 4 = 0
再如,5和6进行按位与运算,其对应的二进制形式分别为: 101 和 110,
0 1 0 1
& 0 1 1 0
-------------
0 1 0 0
其运算结果为二进制的100,即十进制的4,也就是说: 5 & 4 = 4
Python的运行结果如下:

(2)|:按位或运算
按位或运算是二进制对应的每位进行或运算。如果对应的两位都为0,则结果为0,只要有一个为1,则结果为1。
10 和 4的或运算:
1 0 1 0
| 0 1 0 0
------------
1 1 1 0
其或运算的结果为二进制的 1110,对应着十进制的 14,即 10 | 4 = 14.
5 和 6的或运算:
0 1 0 1
| 0 1 1 0
------------
0 1 1 1
5 和 6的按位或运算结果为 0111,对应的十进制为 7 ,即 5 | 6 = 7
Python的运行结果如下:

(3)^:按位异或运算
按位异或运算,即对应的两个二进制位不同时,结果为1,否则为0.
10 和 4 的按位异或运算:
1 0 1 0
^ 0 1 0 0
------------
1 1 1 0
即,结果为二进制1110,对应的十进制为14,亦即:10 ^ 4 = 14
5 和 6 的按位异或运算:
0 1 0 1
^ 0 1 1 0
------------
0 0 1 1
0011对应的十进制数为3,也就是说: 5 ^ 6 = 3
Python中的运行结果:

(4)~:按位取反运算符【公式:-(原数+1)】例如:~10 = -(10+1) = -11
该运算是单操作数运算符,即其只需要一个操作数参与运算。运算时,二进制数上的每位取反,即1变为0, 0变为1.
这里涉及到数字在计算机中的存储形式,在计算机中,最高位为符号位,符号位为0时表示正数,符号位为1时表示负数。
计算依据:
①正数的原码、反码、补码都是一样的
②负数的补码为符号位不变,剩余位取反再加1
③原码求补码: 取反,+1
④补码求原码: 取反,+1
⑤负数是以补码存储在计算机的
⑥取反操作是在原码上进行的
⑦符号位,1表示负数,0表示正数
例:
~(-2)
首先你要知道 -2 在计算机里面的二进制形式,由⑤和②可知:
-2 原码:1000 0000 0000 0010
-2 反码:1111 1111 1111 1101 #符号位不变,各位求反
-2 补码:1111 1111 1111 1110 #补码 = 反码 + 1
1111 1111 1111 1110 就是-2在计算机里面的原型
现在开始对他求反,符号位不变,
按位取反: 0000 0000 0000 0001
很明显是一个正数,其原码为其本身,所以输出为1.
~2
2 原码,反码,补码: 0000 0000 0000 0010
按位取反: 1111 1111 1111 1101
这是一个负数该怎么办?能直接求吗?
很显然是不行的,⑥说了:取反操作计算结果是在原码上进行的,⑤也说了:负数是以补码存储的
1111 1111 1111 1101 是 0000 0000 0000 0010 的反码,但我们想要的是结果,而不是在计算机里面的原型,
恰好,④补码求原码: 取反,+1
取反: 1000 0000 0000 0010
加 1: 1000 0000 0000 0011
于是,我们得到了原码,可以计算结果了
1000 0000 0000 0011 = -3
10按位取反运算(第1位为符号位):
~ 0 1 0 1 0
--------------
1 0 1 0 1
结果最高位为1,为负数,因为负数在计算机中以补码形式存储,转换为原码(先减1,再按位反)为:
1 1011
即对应的十进制数为 -11,即: ~10 = -11.
5 按位取反运算:
~ 0 0 1 0 1
---------------
1 1 0 1 0
结果对应的原码为: 1 0110,对应的十进制数为:-6,即:~5 = -6
Python中的运行结果:

(5)<<:按位左移运算符
其形式为:m<<n
按位左移运算,m对应的二进制数的每位向左移动n位,后面补0.
如10的二进制数 1010 向左移动两位后为:10 1000,其对应的十进制数为:40.
5的二进制数:0101,向左移动两位后为:1 0100,其对应的十进制数为:20
也就是说,一个整数左移n位相当于这个数 m×2的n次方
Python中的运算结果:

(6)>>:按位右移运算符
其形式为:m >> n
即m对应的二进制数每位向右移动n位,移出的二进制数字去掉,最左边空出的变为0.
10的二进制 1010 向右移动1位为:0101,即变为十进制的5;再移动1位变为0010,变为2,再移动1位变为0001,变为1,再移动就一直为0了。
即每向右移动1位,相当于原数除以2,只保留整数部分;移动n位,相当于原数除以2的n次方,只保留整数部分。
在Python中的运算结果:

上述就是6种二进制运算符的运行过程,其在计算机内部运算效率比其他运算符要高的。