1.位运算的特点:效率高,内存消耗少
2.位运算运算符:&(按位与)、|(按位或)、^(异或)、~(按位取反)、>>(右移)、<<(左移)
所有的位运算都是直接操作数据在内存中存储的补码
1)&(按位与)
数字1 & 数字2 - 两个都是1结果就是1,否则为结果为0。
01101101(补) & 10101100(补) -> 00101100(补)
特点某一位上的数和1与可以对这一位上的数进行保存,会对这一位进行置0操作。
print(5 & 9)
"""
5:00000101
9:00001001
5 & 9 = 00000001(补) = 1
-5: 10000101(原) - 11111011(补)
-9: 10001001(原) - 11110111(补)
-5 & -9 = 11110011(补)- 11110010(反) - 10001101(原) = -13
"""
print(-5 & -9)
应用:判断数字的奇偶性
“”"
100101001101101 & 0000000000001
让被判断的数字和 1 进行按位与运算,结果如果是0说明是偶数否则是奇数。
print(100101001101101 & 1) #奇数
print(1230 & 1) #偶数
2)|(按位或)
数字1 | 数字2 - 只要有一个是1就是1,两个都是1结果才是0.
例:
7 | -16
print(7 | -16 )
3)^(异或)
数字1 ^ 数字2 - 不同为1,相同为0
print(18 ^ 9) #27
print(27 ^ 9) #18
异或两次会变为原值
4)~ (按位取反)
-0变1,1变0
~数字
5)>>,<<
数字1 >> 数字2 - 数字1 // 2数字2
数字1 << 数字2 - 数字1 * 2数字2
应用:高效率、快速的乘2或者2的次方数
print(6 << 1) # 6 * 2**1
print(3 << 2) # 3 * 2**2
print(6 << 1) # 6 // 2**1
print(-7 >> 1) # -7 // 2**1
age = 18
age *= 2
age = age << 1