Python位运算符是指:位与&、位或|、位异或^、位取反~、左移位<<、右移位>>等运算符。
Python位运算符主要针对整数类型的数据来操作的,首先把要运算的整数类型的数据转换为二进制形式后再按位进行相关计算。
按位运算符是把数字看作二进制来进行计算的。
Python中的按位运算法则如下:
下表中变量 a 为 60,b 为 13,二进制格式如下:
a = 0011 1100
b = 0000 1101
-----------------
a&b = 0000 1100
a|b = 0011 1101
a^b = 0011 0001
~a = 1100 0011
运算符 | 描述 | 实例 |
& | 按位与运算符:参与运算的两个值,如果两个相应位都为1,则该位的结果为1,否则为0 | (a & b) 输出结果 12 ,二进制解释: 0000 1100 |
| | 按位或运算符:只要对应的二个二进位有一个为1时,结果位就为1。 | (a | b) 输出结果 61 ,二进制解释: 0011 1101 |
^ | 按位异或运算符:当两对应的二进位相异时,结果为1 | (a ^ b) 输出结果 49 ,二进制解释: 0011 0001 |
~ | 按位取反运算符:对数据的每个二进制位取反,即把1变为0,把0变为1 。~x 类似于 -x-1 | (~a ) 输出结果 -61 ,二进制解释: 1100 0011,在一个有符号二进制数的补码形式。 |
<< | 左移动运算符:运算数的各二进位全部左移若干位,由 << 右边的数字指定了移动的位数,高位丢弃,低位补0。 | a << 2 输出结果 240 ,二进制解释: 1111 0000 |
>> | 右移动运算符:把">>"左边的运算数的各二进位全部右移若干位,>> 右边的数字指定了移动的位数 | a >> 2 输出结果 15 ,二进制解释: 0000 1111 |
Python所有位运算符的具体操作:
a = 60 # 60 = 0011 1100
b = 13 # 13 = 0000 1101
c = 0
c = a & b; # 12 = 0000 1100
print "1 - c 的值为:", c
c = a | b; # 61 = 0011 1101
print "2 - c 的值为:", c
c = a ^ b; # 49 = 0011 0001
print "3 - c 的值为:", c
c = ~a; # -61 = 1100 0011
print "4 - c 的值为:", c
c = a << 2; # 240 = 1111 0000
print "5 - c 的值为:", c
c = a >> 2; # 15 = 0000 1111
print "6 - c 的值为:", c
以上实例输出结果:
1 - c 的值为: 12
2 - c 的值为: 61
3 - c 的值为: 49
4 - c 的值为: -61
5 - c 的值为: 240
6 - c 的值为: 15
示例代码:
a = 12
b = 36
print(a & b)
print(a | b)
print(a ^ b)
print(~a)
print(a << 2)
print(a >> 2)
运行结果:
思路解析:
先把要运算的整数类型的数据转换为二进制形式后再按位运算符的具体规则从低位开始逐位向高位依次进行相关计算,详细图解如下:
由上图可知,对于两个操作数0和1,位运算相关规则小结:
- 位与&运算规则:只有两个操作数对应位都是1,结果才是1,其他情况结果为0。
- 位或|运算规则:只有两个操作数对应位都是0,结果才是0,其他情况结果为1。
- 位异或^运算规则:只有两个操作数对应位不同,结果才是1,对应位相同结果是0。
- 位取反~运算规则:操作数是0,位取反~后结果就是1,操作数是1,位取反~后结果就是0。
Python位运算符主要针对整数类型的数据来操作的,如果将字符串等其它类型的数据进行二进制转换会报错的。如下所示:
示例代码:
x = 33
y = 55
print(x & y)
print(x | y)
print(x ^ y)
print('-' * 100)
a = 33
b = 77
print(a & b)
print(a | b)
print(a ^ b)
运行结果:
补充:
利用python将十进制数转换成二进制数
a = 12
a_bin = bin(a) # 将a转换成二进制
print(a_bin)
b = a_bin.replace('0b', '') # 把二进制前面的类型说明符号"0b"替换掉
print(b)
b_int = int(b) # 将b字符串类型转换成整数数值型类型
print(b_int)
print(type(a), type(a_bin), type(b), type(b_int))
运行结果: