Python位运算符:&、|、^、~、<<、>>

Python位运算符:&、|、^、~、<<、>>

运算符 描述 示例
& 按位与,都为1,结果为1,有一个0,就为0 a & b
| 按位或,都为0,结果为0,有一个1,就为1 a | b
^ 按位异或,不同,结果为1,相同,就为0 a ^ b
~ 按位取反,1变0,0变1 ~a
<< 左移动,高位丢弃,低位补0 a << 2,左移2位
>> 右移动,丢弃右移位数,高位补0 a >> 3,右移3位
a = 0b00111100  # 60的二进制
b = 0b00001101  # 13的二进制

print(a&b,'=',bin(a&b))#12 = 0b1100
print(a|b,'=',bin(a|b))#61 = 0b111101
print(a^b,'=',bin(a^b))#49 = 0b110001
print(~a,'=',bin(~a))#-61 = -0b111101
print(a<<2,'=',bin(a<<2))#240 = 0b11110000
print(a>>2,'=',bin(a>>2))#15 = 0b1111

手动运算示例:

图中取反示例不全,注意下文——按位取反详解

Python位运算符:&、|、^、~、<<、>>_第1张图片

按位取反详解

计算机中有原码、反码、补码,均有符号位和数值位,符号位用0表示“正”,用1表示“负”。

计算机一般用补码来表示和存储数值,因为补码可以将符号位和数值位统一处理。

正数的补码,与原码相同。

负数的补码,将原码的数值位取反(0变1,1变0),再加1。

  1. 60取反 = -61
  • 60对应的二进制数:0011 1100(正数的原码和补码)
  • 所有位取反::::1100 0011(负数的补码)
  • 减1,变反码: : :1100 0010(负数的反码)
  • 数值位取反:: ::1011 1101(负数的原码)
  1. -30取反 = 29
  • -30对应的二进制数:1001 1110(负数的原码)
  • 数值位取反:: : :1110 0001(负数的反码)
  • 加1,变补码::::1110 0010(负数的补码)
  • 所有位取反:: : :0001 1101(正数的补码和原码)
print(~60,'=',bin(~60))#-61 = -0b111101
print(~-30,'=',bin(~-30))#29 = 0b11101

你可能感兴趣的:(Python,python)